android压缩图片保存为文件后显示方向被改的解决方法

个人博客地址: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

 

你可能感兴趣的:(Android)