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

 

更多相关文章

  1. android中Toast重复显示bug解决方法
  2. Android(安卓)效率开发之图片---Glide 旋转图片处理
  3. android微信api登录的接入
  4. Android(安卓)APP内存优化之图片优化
  5. 【Android笔记 二】Location获取地理位置信息(上)
  6. Android(安卓)Glide图片加载库基础使用详解
  7. Android(安卓)收集程序崩溃异常信息
  8. Android中的Toast重复显示的问题
  9. 彻底解决Android(安卓)拍照 内存溢出 Out of Memory的问题

随机推荐

  1. Android UTF-8转码
  2. Android笔试题-基础
  3. LayoutInflater源码分析
  4. Android常见问题解决
  5. Android(安卓)Studio升级4.0后的编译问题
  6. Android中常用的优秀开源框架
  7. Android(安卓)滑动切换页面 以及屏幕手势
  8. android LinearGradient线性渐变
  9. Android点击通知栏信息后返回正在运行的
  10. Android实现简单加法计算器