Android之exif格式 ExifInterface

什么是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()判断一下是否有缩略图。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容