数据, 术→技巧, 研发

Python获取照片Exif信息

钱魏Way · · 3,949 次浏览

什么是Exif?

Exif(Exchangeable image file format)是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。Exif信息是镶嵌在 JPEG/TIFF 图像文件格式内的一组拍摄参数,它就好像是傻瓜相机的日期打印功能一样,只不过 Exif信息所记录的资讯更为详尽和完备。Exif 所记录的元数据信息非常丰富,主要包含了以下几类信息:

  • 拍摄日期
  • 拍摄器材(机身、镜头、闪光灯等)
  • 拍摄参数(快门速度、光圈F值、ISO速度、焦距、测光模式等)
  • 图像处理参数(锐化、对比度、饱和度、白平衡等)
  • 图像描述及版权信息
  • GPS定位数据
  • 缩略图

示例:

项目 信息(举例)
制造厂商 Canon
相机型号 Canon EOS-1Ds Mark III
图象方向 正常(upper-left)
图象分辨率X 300
图象分辨率Y 300
分辨率单位 dpi
Software Adobe Photoshop CS Macintosh
最后异动时间 2005:10:06 12:53:19
YCbCrPositioning 2
曝光时间 0.00800 (1/125) sec
光圈值 F22
拍摄模式 光圈优先
ISO感光值 100
Exif信息版本 30,32,32,31
图象拍摄时间 2005:09:25 15:00:18
图象存入时间 2005:09:25 15:00:18
曝光补偿(EV+-) 0
测光模式 点测光(Spot)
闪光灯 关闭
镜头实体焦长 12 mm
Flashpix版本 30,31,30,30
图象色域空间 sRGB
图象尺寸X 5616 pixel
图象尺寸Y 3744 pixel

0xFFE0 — 0xFFD9之间的标识符称为“应用标记”,一般称为APPn,JPEG的编码和解码并不会使用这些段,Exif 正是利用这些信息串记录拍摄信息如快门速度、光圈值等。Exif信息是可以被任意编辑的,因此只有参考的功能。

Exif包含哪些信息?

Exif/TIFF使用的标签数

下面显示了 Exif/TIFF 使用的标签数,如果这个标签组件数目的上限。CompoNo 一栏就代表这一数值。如果这个数值没有,则说明这儿没有上限值。

IFD0 (主图像)使用的标签
标签号 标签名 格式 组件数 描述
0x010e ImageDescription ascii string 用来描述图像. 双字节的字符码不能使用, 如 中文/韩文/日文.
0x010f Make ascii string 表示数字相机的制造商. 在 Exif 标准中, 这个标签是可选的, 但是在DCF中它是必需的.
0x0110 Model ascii string 表示数字相机的模块代码(型号). 在 Exif 标准中, 这个标签是可选的, 但在DCF中它也是必需的.
0x0112 Orientation unsigned short 1
Value 0th Row 0th Column
1 top left side
2 top right side
3 bottom right side
4 bottom left side
5 left side top
6 right side top
7 right side bottom
8 left side bottom

当拍照时, 相机相对于场景的方向. 在右边表示的是’0th row’ 以及 ‘0th column’ 在视觉位置上的关系.

0x011a XResolution unsigned rational 1 图像的 显示/打印 分辨率. 缺省值是 1/72英寸, 但是它没有意义因为个人PC在 显示/打印 图像的时候不使用这个值.
0x011b YResolution unsigned rational 1
0x0128 ResolutionUnit unsigned short 1 XResolution(0x011a)/YResolution(0x011b)的单位. ‘1’ 表示没有单位, ‘2’ 意味着英寸, ‘3’ 表示厘米. 缺省值是 ‘2’(英寸).
0x0131 Software ascii string 显示固件的版本号(数字相机的内部控制软件).(固件Firmware版本或编辑软件)
0x0132 DateTime ascii string 20 图像最后一次被修改时的日期/时间. 日期的格式是 “YYYY:MM:DD HH:MM:SS”+0x00, 一共 20个字节. 如果没有设置时钟或者数字相机没有时钟, 则这个域是用空格来填充. 通常, 它和DateTimeOriginal(0x9003)具有相同的值
0x013e WhitePoint unsigned rational 2 定义图像白点(white point/白点:在彩色分色、照相或摄影时作为色彩平衡测量用途的参考点) 的色度(chromaticity). 如果图像是用CIE标准照度 D65(著名的是 ‘光线/daylight’的国际标准), 这个值是 ‘3127/10000,3290/10000’.
0x013f PrimaryChromaticities unsigned rational 6 定义图像的原始色度. 如果图像使用 CCIR 推荐 709原始色度, 则这个值是 ‘640/1000,330/1000,300/1000,600/1000,150/1000,0/1000’.
0x0211 YCbCrCoefficients unsigned rational 3 当图像的格式是 YCbCr(JPEG的格式), 这个值表示转换成 RGB格式的一个常量. 通常, 这个值是’0.299/0.587/0.114′.
0x0213 YCbCrPositioning unsigned short 1 当图像的格式是 YCbCr 并且使用 ‘子采样/Subsampling'(色度数据的剪切值, 所有的数字相机都使用), 定义了subsampling 像素阵列的色度采样点. ‘1’表示像素阵列的中心, ‘2’ 表示基准点.
0x0214 ReferenceBlackWhite unsigned rational 6 表示黑点(black point)/白点 的参考值. 在YCbCr 格式中,前两个值是 Y的黑点/白点, 下两个值是 Cb, 最后两个值是 Cr. 而在 RGB 格式中, 前两个表示R的黑点/白点, 下两个是 G, 最后两个是 B.
0x8298 Copyright ascii string 表示版权信息
0x8769 ExifOffset unsigned long 1 Exif 子IFD的偏移量

 

Exif 子IFD使用的标签
标签号 标签名 格式 组件数 描述
0x829a ExposureTime unsigned rational 1 曝光时间 (快门速度的倒数). 单位是秒.
0x829d FNumber unsigned rational 1 拍照时的光圈F-number(F-stop).
0x8822 ExposureProgram unsigned short 1 拍照时相机使用的曝光程序. ‘1’ 表示手动曝光, ‘2’ 表示正常程序曝光, ‘3’ 表示光圈优先曝光, ‘4’ 表示快门优先曝光, ‘5’ 表示创意程序(慢速程序), ‘6’ 表示动作程序(高速程序), ‘7’表示 肖像模式, ‘8’ 表示风景模式.
0x8827 ISOSpeedRatings unsigned short 2 CCD 的感光度, 等效于 Ag-Hr 胶片的速率.
0x9000 ExifVersion undefined 4 Exif 的版本号. 用4个ASCII字符来存储. 如果图片是基于Exif V2.1的, 这个值是 “0210”. 因为它不是一个用NULL(0x00)来终结的字符串,所以这里的类型是 ‘undefined’.
0x9003 DateTimeOriginal ascii string 20 照片在被拍下来的日期/时间. 使用用户的软件是不能被修改这个值的. 日期的格式是 “YYYY:MM:DD HH:MM:SS”+0x00, 一共占用20个字节. 如果数字相机没有设置时钟或者 数字相机没有时钟, 这个域使用空格来填充. 在Exif标准中, 这个标签是可选的, 但是在 DCF中是必需的.
0x9004 DateTimeDigitized ascii string 20 照片被数字化时的日期/时间. 通常, 它与DateTimeOriginal(0x9003)具有相同的值. 数据格式是 “YYYY:MM:DD HH:MM:SS”+0x00, 一共占用20个字节. 如果数字相机没有设置时钟或者 数字相机没有时钟, 这个域使用空格来填充. 在Exif标准中, 这个标签是可选的, 但是在 DCF中是必需的.
0x9101 ComponentsConfiguration undefined 表示的是像素数据的顺序. 大多数情况下RGB格式使用 ‘0x04,0x05,0x06,0x00’ 而YCbCr 格式使用 ‘0x01,0x02,0x03,0x00’. 0x00:并不存在, 其他的对应关系为 0x01:Y, 0x02:Cb, 0x03:Cr, 0x04:Red, 0x05:Green, 0x06:Bllue.
0x9102 CompressedBitsPerPixel unsigned rational 1 JPEG (粗略的估计)的平均压缩率.
0x9201 ShutterSpeedValue signed rational 1 用APEX表示出的快门速度. 为了转换成原始的 ‘Shutter Speed’; 则先要计算2的ShutterSpeedValue次幂, 然后求倒数. 例如, 如果 ShutterSpeedValue 是 ‘4’, 快门速度则是1/(24)=1/16秒.
0x9202 ApertureValue unsigned rational 1 拍照时镜头的光圈. 单位是 APEX. 为了转换成普通的 F-number(F-stop), 则要先计算出根号2 2 (=1.4142)的ApertureValue次幂. 例如, 如果ApertureValue 是 ‘5’, F-number 就等于1.41425 = F5.6.
0x9203 BrightnessValue signed rational 1 被拍摄对象的明度, 单位是 APEX. 为了从BrigtnessValue(Bv)计算出曝光量(Ev), 你必须加上 SensitivityValue(Sv).
Ev=Bv+Sv   Sv=log2(ISOSpeedRating/3.125)
ISO100:Sv=5, ISO200:Sv=6, ISO400:Sv=7, ISO125:Sv=5.32.
0x9204 ExposureBiasValue signed rational 1 照片拍摄时的曝光补偿. 单位是APEX(EV).
0x9205 MaxApertureValue unsigned rational 1 镜头的最大光圈值. 你可以通过计算根号2的MaxApertureValue次幂来转换成普通的光圈 F-number (跟ApertureValue:0x9202的处理过程一样).
0x9206 SubjectDistance signed rational 1 到焦点的距离, 单位是米.
0x9207 MeteringMode unsigned short 1 曝光的测光方法. ‘0’ 表示未知, ‘1’ 为平均测光, ‘2’ 为中央重点测光, ‘3’ 是点测光, ‘4’ 是多点测光, ‘5’ 是多区域测光, ‘6’ 部分测光, ‘255’ 则是其他.
0x9208 LightSource unsigned short 1 光源, 实际上是表示白平衡设置. ‘0’ 意味着未知, ‘1’是日光, ‘2’是荧光灯, ‘3’ 白炽灯(钨丝), ’10’ 闪光灯, ’17’ 标准光A, ’18’ 标准光B, ’19’ 标准光C, ’20’ D55, ’21’ D65, ’22’ D75, ‘255’ 为其他.
0x9209 Flash unsigned short 1 ‘0’ 表示闪光灯没有闪光, ‘1’ 表示闪光灯闪光, ‘5’ 表示闪光但没有检测反射光, ‘7’ 表示闪光且检测了反射光.
0x920a FocalLength unsigned rational 1 拍摄照片时的镜头的焦距长度. 单位是毫米.
0x927c MakerNote undefined 制造商的内部数据. 一些制造商如 Olympus/Nikon/Sanyo 等在这个区域中使用IFD 格式的数据.
0x9286 UserComment undefined 存储用户的注释. 这个标签允许使用两字节的德字符或者 unicode. 前8 个字节描述的是字符集. ‘JIS’ 是日文 (著名的有 Kanji).
‘0x41,0x53,0x43,0x49,0x49,0x00,0x00,0x00’:ASCII
‘0x4a,0x49,0x53,0x00,0x00,0x00,0x00,0x00’:JIS
‘0x55,0x4e,0x49,0x43,0x4f,0x44,0x45,0x00’:Unicode
‘0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00’:Undefined
0x9290 SubsecTime ascii string 一些数字相机每秒能拍摄 2~30 张照片, 但是DateTime/DateTimeOriginal/DateTimeDigitized 标签只能记录到秒单位的时间. SubsecTime 标签就是用来记录秒后面的数据(微秒).
例如, DateTimeOriginal = “1996:09:01 09:15:30”, SubSecTimeOriginal = “130”, 合并起来的原始的拍摄 时间就是 “1996:09:01 09:15:30.130”
0x9291 SubsecTimeOriginal ascii string
0x9292 SubsecTimeDigitized ascii string
0xa000 FlashPixVersion undefined 4 存储FlashPix 的版本信息. 如果图像数据是基于 FlashPix formar Ver.1.0, 则这个值为 “0100”. 因为它不是一个用NULL(0x00)来终结的字符串,所以这里的类型是 ‘undefined’.
0xa001 ColorSpace unsigned short 1 定义色彩空间. DCF 图像必须使用 sRGB 色彩空间因此这个值总是 ‘1’. 如果这个照片使用了 其他的色彩空间, 这个值是 ‘65535’:未校准(Uncalibrated).
0xa002 ExifImageWidth unsigned short/long 1 主图像的尺寸大小.
0xa003 ExifImageHeight unsigned short/long 1
0xa004 RelatedSoundFile ascii string 如果数字相机能够纪录图像的音频数据, 则表示音频数据的名字.
0xa005 ExifInteroperabilityOffset unsigned long 1 表示这是一个扩展”ExifR98″, 细节未知. 这个值经常是IFD格式的数据. 当前这儿有两个 目录项, 第一个是 Tag0x0001, 值是”R98″, 下一个是 Tag0x0002, 它的值为 “0100”.
0xa20e FocalPlaneXResolution unsigned rational 1 表示CCD的像素密度. 如果你的相机是百万像素的并且是用低分辨率(如VGA模式) 来拍摄照片, 这个值可以通过照片的分辨率来重新采样. 在这种情况下, FocalPlaneResolution 就不是CCD的实际的分辨率.
0xa20f FocalPlaneYResolution unsigned rational 1
0xa210 FocalPlaneResolutionUnit unsigned short 1 FocalPlaneXResoluton/FocalPlaneYResolution的单位. ‘1’ 表示没有单位, ‘2’是英寸inch, ‘3’ 表示厘米.

注意:一些Fujifilm的数码相机(如.FX2700,FX2900,Finepix4700Z/40i 等) 使用的值是 ‘3’ 所以它的单位一定是 ‘厘米’ , 但是它们的分辨率单位就变成’8.3mm?'(1/3in.?). 这是Fuji 的 BUG? 从Finepix4900Z 开始这个值就使用 ‘2’ 了但仍然跟实际的值不吻合.

0xa215 ExposureIndex unsigned rational 1 跟ISOSpeedRatings(0x8827)一样但是数据类型是 unsigned rational. 只有Kodak的数字相机使用 这个标签来替代 ISOSpeedRating, 我不知道这是为什么(历史原因?).
0xa217 SensingMethod unsigned short 1 表示图像传感器单元的类型. ‘2’ 意味着这是一个芯片颜色区域传感器, 几乎所有的数字相机都 使用这个类型.
0xa300 FileSource undefined 1 显示图像来源. 值 ‘0x03’ 表示图像源是数字定格相机.
0xa301 SceneType undefined 1 表示拍摄场景的类型. 值 ‘0x01’ 表示图像是通过相机直接拍摄出来的.
0xa302 CFAPattern undefined 表示色彩过滤阵列(CFA) 几何模式.

长度 类型 意义
2 short Horizontal repeat pixel unit = n
2 short Vertical repeat pixel unit = m
1 byte CFA value[0,0]
: : :
1 byte CFA value[n-1,0]
1 byte CFA value[0,1]
: : :
1 byte CFA value[n-1,m-1]

色彩过滤和CFA值之间的关系.

Filter Color Red Green Blue Cyan Magenta Yellow White
CFA value 0 1 2 3 4 5 6

 

R G
G B

例如, 普通的 RGB 过滤器使用左表的副本, 这个值是 ‘0x0002,0x0002,0x00,0x01,0x01,0x02’.

 

Interoperability IFD使用的标签
标签号 标签名 格式 组件号 描述
0x0001 InteroperabilityIndex Ascii string 4 如果这个IFD 是主图像的 IFD 并且文件内容采用的是 ExifR98 v1.0, 那这个值就是 “R98”. 如果是所略图的, 这个值则是 “THM”.
0x0002 InteroperabilityVersion Undefined 4 纪录interoperability的版本. “0100” 表示版本1.00.
0x1000 RelatedImageFileFormat Ascii string any 纪录图像文件的文件格式. 这个值是 ascii 字符串(如. “Exif JPEG Ver. 2.1”).
0x1001 RelatedImageWidth Short or Long 1 纪录图像的大小尺寸.
0x1001 RelatedImageLength Short or Long 1

 

IFD1 (缩略图)使用的标签
标签号 标签名 格式 组件数 描述
0x0100 ImageWidth unsigned short/long 1 表示缩略图的大小.
0x0101 ImageLength unsigned short/long 1
0x0102 BitsPerSample unsigned short 3 当图像格式没有经过压缩, 这个值表示每像素的比特位的数目. 通常这个值是 ‘8,8,8’
0x0103 Compression unsigned short 1 代表压缩的方式. ‘1’ 表示非压缩, ‘6’ 表示JPEG 压缩格式.
0x0106 PhotometricInterpretation unsigned short 1 表示图像数据组件的色彩空间. ‘1’ 意味着单色, ‘2’表示 RGB, ‘6’ 表示 YCbCr.
0x0111 StripOffsets unsigned short/long 如果图像格式没有经过压缩, 这个值表示的是到图像数据的偏移量. 在图像数据被分割的 情况下它有多个值.
0x0115 SamplesPerPixel unsigned short 1 如果图像格式没有经过压缩, 这个值表示每个像素中存储的组件数目. 在彩色图像中, 此值为 ‘3’.
0x0116 RowsPerStrip unsigned short/long 1 如果图像格式没有经过压缩 并且 图像被分割存储, 这个值表示每条数据带存储了多少行数据 . 如果图像没有被分割, 它与ImageLength(0x0101)同值.
0x0117 StripByteConunts unsigned short/long 如果图像格式没有经过压缩 并且 图像被分割存储, 这个值表示每条数据带使用了多少字节的 数据 且 有多个值. 如果图像没有被分割, 它只有一个且表示为图像的所有数据的大小.
0x011a XResolution unsigned rational 1 图像的显示/打印分辨率. 很多的数字相机都使用1/72英寸的规格, 但对于个人PC 来讲这个值没有任何意义因为在显示/打印的时候不使用这个值.
0x011b YResolution unsigned rational 1
0x011c PlanarConfiguration unsigned short 1 如果图像格式是非压缩YCbCr的, 这个值表示YCbCr数据的字节对齐顺序. ‘1’, 表示Y/Cb/Cr值是一个 chunky format, 对于每个子采样像素都是连续的. ‘2’, 则表示Y/Cb/Cr 值被分割存储在 Y plane/Cb plane/Cr plane 格式中.
0x0128 ResolutionUnit unsigned short 1 XResolution(0x011a)/YResolution(0x011b)的单位. ‘1’ 表示英寸, ‘2’ 表示厘米.
0x0201 JpegIFOffset unsigned long 1 当图像格式是JPEG时, 这个值表示到 JPEG 数据的偏移量.
0x0202 JpegIFByteCount unsigned long 1 当图像格式是JPEG时, 表示JPEG 图像的数据大小.
0x0211 YCbCrCoefficients unsigned rational 3 当图像格式是YCbCr时, 它表示转换成RGB格式的一个常量值. 通常是’0.299/0.587/0.114′.
0x0212 YCbCrSubSampling unsigned short 2 当图像格式是YCbCr时 并且 使用子采样(色度数据的剪切值, 所有的数字相机都使用)时, 这个值表示有多少个色度数据被采样了. 首先第一个值表示水平的, 下一个值表示垂直的 采样率.
0x0213 YCbCrPositioning unsigned short 1 当图像格式是YCbCr时 并且 使用子采样(色度数据的剪切值, 所有的数字相机都使用)时, 这个值定义了被采样的像素阵列的色度采样点. ‘1’ 表示像素阵列的中心, ‘2’ 表示基准点(0,0).
0x0214 ReferenceBlackWhite unsigned rational 6 表示黑点/白点的参考值. 在 YCbCr 格式的情况下, 前两个表示了Y的黑/白, 下两个是 Cb, 最后两个是 Cr. 在 RGB 的情况下, 前两个表示R的黑/白, 下两个是 G, 最后两个是 B.

 

Misc Tags
标签号 标签名 格式 组件数 描述
0x00fe NewSubfileType unsigned long 1
0x00ff SubfileType unsigned short 1
0x012d TransferFunction unsigned short 3
0x013b Artist ascii string
0x013d Predictor unsigned short 1
0x0142 TileWidth unsigned short 1
0x0143 TileLength unsigned short 1
0x0144 TileOffsets unsigned long
0x0145 TileByteCounts unsigned short
0x014a SubIFDs unsigned long
0x015b JPEGTables undefined
0x828d CFARepeatPatternDim unsigned short 2
0x828e CFAPattern unsigned byte
0x828f BatteryLevel unsigned rational 1
0x83bb IPTC/NAA unsigned long
0x8773 InterColorProfile undefined
0x8824 SpectralSensitivity ascii string
0x8825 GPSInfo unsigned long 1
0x8828 OECF undefined
0x8829 Interlace unsigned short 1
0x882a TimeZoneOffset signed short 1
0x882b SelfTimerMode unsigned short 1
0x920b FlashEnergy unsigned rational 1
0x920c SpatialFrequencyResponse undefined
0x920d Noise undefined
0x9211 ImageNumber unsigned long 1
0x9212 SecurityClassification ascii string 1
0x9213 ImageHistory ascii string
0x9214 SubjectLocation unsigned short 4
0x9215 ExposureIndex unsigned rational 1
0x9216 TIFF/EPStandardID unsigned byte 4
0xa20b FlashEnergy unsigned rational 1
0xa20c SpatialFrequencyResponse unsigned short 1
0xa214 SubjectLocation unsigned short 1

Exif的读取及修改及删除

读取示例

from PIL import Image
from PIL.ExifTags import TAGS

for (k,v) in Image.open('DSC03911.JPG')._getexif().iteritems():
    print '%s = %s' % (TAGS.get(k),v)

import exifread
f = open("DSC03911.JPG", 'rb')
tags = exifread.process_file(f)
for tag in tags.keys():
print tag, tags[tag]

其他工具:

Exif信息的利用

  • 读取图片经纬度匹配地理位置
  • 读取设备,确定图片质量

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注