数据, 术→技巧, 研发

Python获取照片Exif信息

钱魏Way · · 4,427 次浏览
!文章内容如有错误或排版问题,请提交反馈,非常感谢!

什么是 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
YCbCr Positioning 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)
闪光灯 关闭
镜头实体焦长 12mm
Flashpix 版本 30,31,30,30
图象色域空间 sRGB
图象尺寸 X 5616 pixel
图象尺寸 Y 3744 pixel

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

Exif 包含哪些信息?

Exif/TIFF使用的标签数

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

0x0132

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 版本或编辑软件)
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表示出的快门速度.为了转换成原始的’ShutterSpeed’;则先要计算2的ShutterSpeedValue次幂,然后求倒数.例如,如果ShutterSpeedValue是’4′,快门速度则是1/(24)=1/16秒.
0x9202 ApertureValue unsigned rational 1 拍照时镜头的光圈.单位是APEX.为了转换成普通的F-number(F-stop),则要先计算出根号22(=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 format 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格式的数据.当前这儿有两个目录项,第一个是Tag 0x0001,值是”R98″,下一个是Tag 0x0002,它的值为”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值之间的关系。

FilterColor 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’。

 

InteroperabilityIFD使用的标签
标签号 标签名 格式 组件号 描述
0x0001 InteroperabilityIndex Ascii string 4 如果这个IFD是主图像的IFD并且文件内容采用的是Exif R98 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。

 

MiscTags
标签号 标签名 格式 组件数 描述
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信息的利用

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

发表回复

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