网上很多解决这个问题的方法基本上都是:
一、获取图片信息,得到旋转的角度;
二、通过Matrix进行旋转修正,返回一个Bitmap对象;
我觉得这个挺麻烦的,这里我给出我的方法:
我使用的图片加载框架是[Android-Universal-Image-Loader,在给imageView加载图片时,通常会调用如下的方法:
public static void setImageSrc(String src, ImageView imageViews, DisplayImageOptions options) {
// 如果没有图片,设置图片为空
if (null != src) {
ImageLoader.getInstance().displayImage(src, imageViews, options);
} else {
imageViews.setVisibility(View.GONE);
}
}
特殊情况下需要调用:
ImageLoader.getInstance().displayImage(String uri, ImageView imageView, DisplayImageOptions options,ImageLoadingListener listener)这个方法,尤其是在预览图片的时候需要使用这个方法进行图片加载的监听以及在加载图片时对progressBar的显示和隐藏的监听操作。
关键点在于:这两个方法都需要传入一个DisplayImageOptions 对象,该对象一般在初始化Android-Universal-Image-Loader框架的时候都应该被初始化的,这里我关键代码处理方式如下:
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参数(旋转,翻转)default is false
.considerExifParams(true)
.imageScaleType(ImageScaleType.EXACTLY)//图像将完全按比例缩小的目标大小
.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;
}
其中,最关键的是getBuilder()方法中.considerExifParams(true)设置为true,这表示考虑JPEG图像EXIF参数(旋转,翻转),就这一句话,解决了图片信息中有反转和旋转信息的图片预览问题,最终的结果就是保证图片都是正着显示。