網(wǎng)上很多解決這個問題的方法基本上都是:
一、獲取圖片信息,得到旋轉(zhuǎn)的角度;
二、通過Matrix進(jìn)行旋轉(zhuǎn)修正,返回一個Bitmap對象;
我覺得這個挺麻煩的,這里我給出我的方法:
我使用的圖片加載框架是[Android-Universal-Image-Loader,在給imageView加載圖片時,通常會調(diào)用如下的方法:
public static void setImageSrc(String src, ImageView imageViews, DisplayImageOptions options) {
// 如果沒有圖片,設(shè)置圖片為空
if (null != src) {
ImageLoader.getInstance().displayImage(src, imageViews, options);
} else {
imageViews.setVisibility(View.GONE);
}
}
特殊情況下需要調(diào)用:
ImageLoader.getInstance().displayImage(String uri, ImageView imageView, DisplayImageOptions options,ImageLoadingListener listener)這個方法,尤其是在預(yù)覽圖片的時候需要使用這個方法進(jìn)行圖片加載的監(jiān)聽以及在加載圖片時對progressBar的顯示和隱藏的監(jiān)聽操作。
關(guān)鍵點在于:這兩個方法都需要傳入一個DisplayImageOptions 對象,該對象一般在初始化Android-Universal-Image-Loader框架的時候都應(yīng)該被初始化的,這里我關(guān)鍵代碼處理方式如下:
public static void initImageLoaderConfig(Context context) {
File cacheDir = StorageUtils.getOwnCacheDirectory(context, "image_loader/zy_cache");
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPoolSize(10)
.memoryCacheExtraOptions(480, 800) // default = device screen dimensions
.threadPriority(Thread.NORM_PRIORITY - 1) // default
.tasksProcessingOrder(QueueProcessingType.FIFO) // default
.denyCacheImageMultipleSizesInMemory()
.memoryCache(new LruMemoryCache(2 * 1024 * 1024))
.memoryCacheSize(2 * 1024 * 1024)
.memoryCacheSizePercentage(13) // default
.diskCache(new UnlimitedDiskCache(cacheDir)) // default
.diskCacheSize(50 * 1024 * 1024)
.diskCacheFileCount(100)
.diskCacheFileNameGenerator(new Md5FileNameGenerator()) // default
.imageDownloader(new BaseImageDownloader(context)) // default
.imageDecoder(new BaseImageDecoder(true)) // default
.defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
.build();
ImageLoader.getInstance().init(config);
getBuilder();
}
public static DisplayImageOptions.Builder getBuilder(){
builder = new DisplayImageOptions.Builder()
.cacheInMemory(true)
.cacheOnDisk(true)
//是否考慮JPEG圖像EXIF參數(shù)(旋轉(zhuǎn),翻轉(zhuǎn))default is false
.considerExifParams(true)
.imageScaleType(ImageScaleType.EXACTLY)//圖像將完全按比例縮小的目標(biāo)大小
.bitmapConfig(Bitmap.Config.RGB_565);
return builder;
}
public static DisplayImageOptions getDisplayImageOptions(int onLoadingResourceId, int emptyResourceId, int failResourceId) {
DisplayImageOptions options = builder
.showImageOnLoading(onLoadingResourceId)
.showImageForEmptyUri(emptyResourceId)
.showImageOnFail(failResourceId)
.build();
return options;
}
其中,最關(guān)鍵的是getBuilder()方法中.considerExifParams(true)設(shè)置為true,這表示考慮JPEG圖像EXIF參數(shù)(旋轉(zhuǎn),翻轉(zhuǎn)),就這一句話,解決了圖片信息中有反轉(zhuǎn)和旋轉(zhuǎn)信息的圖片預(yù)覽問題,最終的結(jié)果就是保證圖片都是正著顯示。