一、 碰到的问题
写这篇文章的动机源自于这波迭代中碰到的一个问题:
在IM拍照时,在三星s7 eadge上拍完照片后从sd上拿到的地址设置给Imageview后显示时,图片旋转了90度。But我拍照的时候明明是竖着拍的,相册预览也是竖着的,为什么拿到图片后就成了横着的?
对比了另一台手机锤子坚果U1,没这个问题,因此怀疑是跟相机的机型相关。
想到的解决方案:
把读取到的图片作为一个bitmap放在一个画布上,然后旋转画布来控制图片展示的方向。
问题来了:
这样确实解决了三星上的问题,但是原来没问题的机型上——歪了。
至此,问题明确了:我如何拿到的图片的实际方向?
二、Exif
借助强大的Google,搜到了一个叫做Exif
的东西,它是什么呢?
维基百科如是说:
EXIF:可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif), 是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
包括:分辨率,旋转方向,感光度、白平衡、拍摄的光圈、焦距、分辨率、相机品牌、型号、GPS等信息。
Exif可以附加于JPEG、TIFF、RIFF等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。
下图是维基百科提供的一个exif图片:
![1210078-0495c89ed20effa7.jpg](https://i-blog.csdnimg.cn/blog_migrate/c8f250f96f05eb01c91990205c3ce91c.webp?x-image-process=image/format,png)
问题来了:
知道了Exif这个信息,对我有什么用?
可以看到在exif中有一个叫做图像方向的东西,那是否可以借助这个属性来解决我的问题呢?
三、ExifInterface 源码解析
求助强大的Google 爸爸:
exif android
爸爸给我呈现了如下结果:
有了这两个文档我的问题迎刃而解。
看看ExifInterface是毛:
乍一看这是个接口挺迷的,点进文档一看是个class。
ExifInterface是Android为我们提供的一个支持库,随着 25.1.0 支持库的发布,支持库大家庭迎来了一名新成员:ExifInterface 支持库。由于 Android 7.1 引入了对框架 ExifInterface 的重大改进,最低可以支持到API 9+。
在build.gradle文件中引入下面的代码,便可以使用ExifInterface了:
implementation 'com.android.support:exifinterface:27.1.1'
如何使用ExifInterface解决我的问题,定位到它的源码,可以看到它为我们提供了3个构造方法:
/**
* 从给定的图片路径中读取图片的exif tag信息.
*/
public ExifInterface(String filename) throws IOException {
......
try {
......
loadAttributes(in);
} finally {
IoUtils.closeQuietly(in);
}
}
/**
* 从指定的图像文件描述符中读取Exif标签. 属性突变仅支持可写和可搜索的文件描述符. 此构造函数不会倒回给定文件描述符的偏移量。开发人员在使用后应关闭文件描述符。
*/
public ExifInterface(FileDescriptor fileDescriptor) throws IOException {
......
try {
in = new FileInputStream(fileDescriptor);
loadAttrib