什么是exif?
Exif是一种图像文件格式,它的数据存储与JPEG格式是完全相同的。实际上Exif格式就是在JPEG格式头部插入了数码照片的信息,包括拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及GPS全球定位系统数据、缩略图等。你可以利用任何可以查看JPEG文件的看图软件浏览Exif格式的照片,但并不是所有的图形程序都能处理Exif信息。
简单来说,Exif 信息就是由数码相机在拍摄过程中采集一系列的信息,然后把信息放置在我们熟知的 JPEG/TIFF 文件的头部,也就是说 Exif信息是镶嵌在 JPEG/TIFF 图像文件格式内的一组拍摄参数,它就好像是傻瓜相机的日期打印功能一样,只不过 Exif信息所记录的资讯更为详尽和完备。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()判断一下是否有缩略图。