Android 解决手机拍照图片宽高与实际不符合

背景

功能迭代中,小米10相机拍摄的图片,BitmapFactory解析的宽高与实际相反,一顿Google后,定位原因是拍摄的照片和视频被旋转了90度,通过ExifInterface可以解决(能够拿到方向),在此简单记录下

ExifInterface

ExifInterface是一个用于读写JPEG文件或原始图像文件中的Exif标签的类,支持的文件格式 JPEG, DNG, CR2, NEF, NRW, ARW, RW2, ORF, PEF, SRW, RAF and HEIF

Tips: 官方建议使用AndroidX版本,支持更多元数据的获取,比如如GPS、Date

dependencies {
    
    
	// 没有特殊需求,直接使用Android自带media库中的也可以
    implementation "androidx.exifinterface:exifinterface:1.3.1"
}

Exif 是什么?

Exif是一种图像文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及GPS全球定位系统数据、缩略图等。你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息

方法介绍、代码示例

1、 方法介绍

首先看下ExifInterface构造方法(见下图),支持File、filename、FileDescriptor、InputStream,这样基本就全乎了。

在这里插入图片描述

当ExifInterface 创建后,可以通过ExifInterface中的方法+静态变量获取对应值。具体用那个方法,参考每个静态变量上的Type。部分截图如下

在这里插入图片描述
在这里插入图片描述

2、 代码示例

val exifInterface = ExifInterface(filepath)
val rotation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL)
val width = exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_WIDTH, 0)
val height = exifInterface.getAttributeInt(ExifInterface.TAG_IMAGE_LENGTH, 0)
if (rotation == ExifInterface.ORIENTATION_ROTATE_90 || rotation == ExifInterface.ORIENTATION_ROTATE_270) {
    
    
	// 图片被旋转90或者270,使用时候将width、height换下
}else {
    
    
	// 宽高对应
}

参考
https://developer.android.com/reference/android/media/ExifInterface
https://developer.android.google.cn/jetpack/androidx/releases/exifinterface?hl=zh-cn

猜你喜欢

转载自blog.csdn.net/ithe1001/article/details/109755710