个人博客地址:http://yedajiang44.com/blog
今天使用libjpeg-turbo压缩图片后再显示时图片方向变了,原图时纵向的图,压缩后再加载变成横向的了,最主要的原因是压缩后的图片文件没有了EXIF信息
有可能是我调用libjpeg-turbo的c文件代码问题,但是我对c是毛都不懂?所以只能从android下手
先上代码(kotlin)
/**
* 复制原图Exif信息到压缩后图片的Exif信息
* @param sourcePath 原图路径
* @param targetPath 目标图片路径
*/
private fun copyExif(sourcePath: String, targetPath: String) {
try {
val source = ExifInterface(sourcePath)
val target = ExifInterface(targetPath)
source.javaClass.declaredFields.forEach { member ->//获取ExifInterface类的属性并遍历
member.isAccessible = true
val tag = member.get(source)//获取原图EXIF实例种的成员变量
if (member.name.startsWith("TAG_") && tag is String) {//判断变量是否以TAG开头,并且是String类型
target.setAttribute(tag, source.getAttribute(tag))//设置压缩图的EXIF信息
target.saveAttributes()//保存属性更改
}
}
} catch (e: Exception) {
}
}
解决方法一共有两种:
第一种:压缩前对bitmap方向进行修复(适合非大尺寸的bitmap)
第二种:压缩后对图片的EXIF信息进行修复(适合图片文件)
实不相瞒,我首先想到的时第一种,但是放弃了,因为我这个压缩是质量压缩,所以尺寸如果过大的话肯定会内存溢出
ps:由于第一种不适合我,且非本文主题,所以就赘述了,这种方式的代码网上很多,搜一搜就有了
于是我用了第二种方法
Android种有个专门操作图片EXIF的类叫ExifInterface
这个类有个getAttribute和setAttribute方法,这两个就是操作EXIF属性的方法
注意!更改过属性后需要调用saveAttributes方法来保存更改
由于我这个app是质量压缩,所以我想把原图种的EXIF信息都给拷贝到压缩后的图片种,但是说实话啊,ExifInterface的TAG_xxx实在是太多了
所以我就通过反射来拷贝,但是性能也就低了下来。。。没办法,TAG实在太多了
下面是效果图
原图的EXIF
压缩后EXIF