Android之exif格式 ExifInterface

## 什么是exif?


>Exif是一种图像文件格式,它的数据存储与[JPEG](https://baike.baidu.com/item/JPEG)格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的[光圈](https://baike.baidu.com/item/%E5%85%89%E5%9C%88)、[快门](https://baike.baidu.com/item/%E5%BF%AB%E9%97%A8/82245)、[白平衡](https://baike.baidu.com/item/%E7%99%BD%E5%B9%B3%E8%A1%A1)、[ISO](https://baike.baidu.com/item/ISO/5397601)、[焦距](https://baike.baidu.com/item/%E7%84%A6%E8%B7%9D)、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时[录制](https://baike.baidu.com/item/%E5%BD%95%E5%88%B6)的声音以及GPS[全球定位系统](https://baike.baidu.com/item/%E5%85%A8%E7%90%83%E5%AE%9A%E4%BD%8D%E7%B3%BB%E7%BB%9F)数据、[缩略图](https://baike.baidu.com/item/%E7%BC%A9%E7%95%A5%E5%9B%BE)等。你可以[利用](https://baike.baidu.com/item/%E5%88%A9%E7%94%A8/882910)任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息。




简单来说,Exif 信息就是由数码相机在拍摄过程中采集一系列的信息,然后把信息放置在我们熟知的 JPEG/TIFF 文件的头部,也就是说 Exif信息是镶嵌在 JPEG/TIFF 图像文件格式内的一组拍摄参数,它就好像是傻瓜相机的日期打印功能一样,只不过 Exif信息所记录的[资讯](https://baike.baidu.com/item/%E8%B5%84%E8%AE%AF)更为详尽和完备。Exif 所记录的元数据信息非常丰富,主要包含了以下几类信息:


*   拍摄日期


*   拍摄器材(机身、镜头、闪光灯等)


*   拍摄参数(快门速度、光圈F值、ISO速度、焦距、测光模式等)


*   图像处理参数(锐化、对比度、饱和度、白平衡等)


*   图像描述及版权信息


*   GPS定位数据


*   缩略图


### 常见标签 
| 标签号 | Exif 定义名 | 中文定义名 | 备注 |
| 0x010E| ImageDescription | 图像描述 | - |
| 0x013B | Artist | 作者 | 使用者的名字 |
| 0x010F | Make | 生产商 | 相机生产厂家 |
| 0x0110 | Model | 型号 | 相机型号 |
| 0x0112 | Orientation | 方向 | 有的相机支持,有的不支持 |
| 0x011A | XResolution | 水平方向分辨率 | - |
| 0x011B | YResolution | 垂直方向分辨率 | - |
| 0x0128 | ResolutionUnit | 分辨率单位 | - |
| 0x0131 | Software | 软件 | 固件Firmware版本或编辑软件 |
| 0x0132 | DateTime | 日期和时间 | 照片最后的修改时间 |
| 0x0213 | YCbCrPositioning | YCbCr定位 | 色度抽样方法 |
| 0x8769 | ExifOffset | Exif子IFD偏移量 | - |
| 0x829A | ExposureTime | 曝光时间 | 即快门速度 |
| 0x829D | FNumber | 光圈系数 | 光圈的F值 |
| 0x8822 | ExposureProgram | 曝光程序 | 自动曝光、光圈优先、快门优先、M档等 |
| 0x8827 | ISOSpeedRatings | ISO感光度 | Exif 2.3 中更新为“PhotographicSensitivity” |
| 0x9000 | ExifVersion | Exif 版本 | 参见“历史版本”一节 |
| 0x9003 | DateTimeOriginal | 拍摄时间 | 照片拍摄的时间 |
| 0x9004 | DateTimeDigitized | 数字化时间 | 照片被写入内存卡的时间 |
| 0x9204 | ExposureBiasValue | 曝光补偿 | - |
| 0x9205 | MaxApertureValue | 最大光圈 | APEX为单位 |
| 0x9207 | MeteringMode | 测光模式 | 平均测光、中央重点测光、点测光等 |
| 0x9208 | Lightsource | 光源 | 一般记录白平衡设定 |
| 0x9209 | Flash | 闪光灯 | 记录闪光灯状态 |
| 0x920A | FocalLength | 镜头焦距 | 镜头物理焦距 |
| 0x927C | MakerNote | 厂商注释 | 参见“厂商注释”一节 |
| 0x9286 | UserComment | 用户注释 | 用户自定义数据 |
| 0xA000 | FlashPixVersion | FlashPix版本 | - |
| 0xA001 | ColorSpace | 色彩空间 | 一般为sRGB |
| 0xA002 | ExifImageWidth | 图像宽度 | 图像横向像素数 |
| 0xA003 | ExifImageLength | 图像高度 | 图像纵向像素数 |
| 0xA433 | LensMake | 镜头生产商 | - |
| 0xA434 | LensModel | 镜头型号 | - |




## Android 之 操作Exif的类ExifInterface 
 一个在JPEG文件或RAW图像文件中读写Exif标签的类
支持的格式有:JPEG, DNG, CR2, NEF, NRW, ARW, RW2, ORF and RAF。


## 获取信息
获取Exif信息大致有以下一些方法:


- String getAttribute(String tag):获取图片中属性为tag的字符串值。


- double getAttribute(String tag,double defaultValue):获取图片中属性为tag的double值。


- int getAttributeInt(String tag,defaultValue):获取图片中属性为tag的int值。


- void setAttribute(String tag,String value):根据输入参数,设定图片Exif的值。


- void saveAttrubutes():把内存中图片的Exif写入到图片中。


ExifInterface类中封装了很多tag,这些tag就是Exif中标签,根据上面的方法就能获取某个标签的值,感觉这些个标签的值是以key-value形式存储的。
下面给出常用的一些标签:


- ExifInterface.TAG_ORIENTATION //旋转角度,整形表示,在ExifInterface中有常量对应表示
- ExifInterface.TAG_DATETIME //拍摄时间,取决于设备设置的时间
- ExifInterface.TAG_MAKE //设备品牌
- ExifInterface.TAG_MODEL //设备型号,整形表示,在ExifInterface中有常量对应表示
- ExifInterface.TAG_FLASH //闪光灯
- ExifInterface.TAG_IMAGE_LENGTH //图片高度
- ExifInterface.TAG_IMAGE_WIDTH //图片宽度
- ExifInterface.TAG_GPS_LATITUDE //纬度
- ExifInterface.TAG_GPS_LONGITUDE //经度
- ExifInterface.TAG_GPS_LATITUDE_REF //纬度名(N or S)
- ExifInterface.TAG_GPS_LONGITUDE_REF //经度名(E or W)
- ExifInterface.TAG_EXPOSURE_TIME //曝光时间
- ExifInterface.TAG_APERTURE //光圈值
- ExifInterface.TAG_ISO //ISO感光度
- ExifInterface.TAG_DATETIME_DIGITIZED //数字化时间
- ExifInterface.TAG_SUBSEC_TIME //
- ExifInterface.TAG_SUBSEC_TIME_ORIG //
- ExifInterface.TAG_SUBSEC_TIME_DIG //
- ExifInterface.TAG_GPS_ALTITUDE //海拔高度
- ExifInterface.TAG_GPS_ALTITUDE_REF //海拔高度
- ExifInterface.TAG_GPS_TIMESTAMP //时间戳
- ExifInterface.TAG_GPS_DATESTAMP //日期戳
- ExifInterface.TAG_WHITE_BALANCE //白平衡
- ExifInterface.TAG_FOCAL_LENGTH //焦距
- ExifInterface.TAG_GPS_PROCESSING_METHOD //用于定位查找的全球定位系统处理方法。


贴出代码:


```
try {
            ExifInterface exifInterface = new ExifInterface(path);
            String dateData = exifInterface.getAttribute(ExifInterface.TAG_DATETIME);
        } catch (IOException e) {
            e.printStackTrace();
        }
```
创建ExifInterface:
ExifInterface构造函数有三个,接受一个参数
- String pash
- FileDescriptor fileDescriptor
- InputStream inputStream






还有一点需要注意的,saveAttributes()方法主要用于把内存中所有当前Exif信息保存到目标图片中,依照官方文档的解释,它是一个低效率的,它会把图片的所有Exif信息,重新依次保存到目标图片,所以推荐使用setAttribute()方法进行设置Exif信息。但是在实际应用中发现,如果仅使用setAttribute()设置Exif信息,将不会写入到目标图片中,只有在改变Exif信息后,调用saveAttribute()才可以把新的Exif写入到目标图片中。


## 写入信息


ExifInterface exifInterface = new ExifInterface(filePath);
exifInterface.setAttribute(ExifInterface.TAG_GPS_ALTITUDE,"1/1000");
exifInterface.setAttribute(ExifInterface.TAG_ORIENTATION,"6");
exifInterface.setAttribute(ExifInterface.TAG_IMAGE_WIDTH,"2000");
exifInterface.saveAttributes();


## 缩略图
getThumbnail()这个方法可以生成一个缩略图,返回一个字节数组,得到字节数组就可以轻松生成Bitmap。


但是在调用这个方法前,最好先调用exifInterface.hasThumbnail()判断一下是否有缩略图。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值