地址0x000c~0x000d处存放的值为 0x0500, 说明数据的格式是一个 unsigned rational(0x0005).地址0x000e~0x0011处存放的值是 0x01000000, 说明组件的数据只有 '1'个. Unsigned rational的数据大小是8字节(组件的大小), 因此数据的总长度是 1x8=8字节.总数居长度比4字节大了, 因此它后面的4个字节里面存放的是一个指向实际数据的偏移量地址.地址0x0012~0x0015处存放的是 0x26000000, 表示XResolution(水平分辨率) 数据的存储地址是0x0026地址0x0026~0x0029处存放的数据是 0x48000000, 说明分子的值为 72, 而地址0x002a~0x002d 处存放的是0x0100000000, 说明分母为 '1'. 因此XResoultion 的值是 72/1.地址0x0016~0x0017处存放的数据为0x6987, 表示下一个标签是 ExifOffset(0x8769). 这就是 指向Exif子IFD的偏移量而它的数据格式是 0x0004, 即是一个无符号的长整形(unsigned long integer).这个标签只有一个组件. 无符号长整形的数据大小是4字节, 因此总数据长度为4字节.总数据长度是 4字节, 则说明下一个4字节的数据中存放的是Exif子IFD的偏移量.地址0x001e~0x0021处存放的是 0x11020000, 则说明Exif子IFD的开始地址是 '0x0211'.这是最后一个目录项, 接下来的4个字节存放的是下一个IFD的偏移地址.地址0x0022~0x0025处存放的是 0x40000000, 就可以知道下一个IFD的开始地址为 '0x0040'

缩略图

Exif格式中包含缩略图像(除了Ricoh RDC-300Z). 通常它被放到IFD1的后面. 缩略图有 3 种格式; JPEG 格式(JPEG 使用YCbCr), RGB TIFF 格式, YCbCr TIFF 格式. 在Exif2.1之后推荐使用JPEG 格式和160x120像素的尺寸. 根据 DCF 规格, 缩略图像必须使用JPEG 格式以及图像的尺寸 固定为160x120 像素.
JPEG格式的缩略图
IFD1中的标签Compression(0x0103)如果是 '6', 则缩略图就是JPEG格式. 几乎所有的 Exif图像中缩略图都使用JPEG 格式. 在这种情况下, 你能从IFD1的JpegIFOffset(0x0201)标签中得到缩略图的偏移量, 从标签JpegIFByteCount(0x0202)中得到缩略图的大小. 数据格式则是普通的 JPEG 格式, 也就是从0xFFD8处开始在0xFFD9处结束.
TIFF格式的缩略图
IFD1的标签Compression(0x0103)如果是 '1', 则缩略图的格式就没有经过压缩的 (就是TIFF 图像). 缩略图数据的开始点是标签StripOffset(0x0111), 缩略图的尺寸 就是标签StripByteCounts(0x0117)之和.
如果缩略图使用非压缩格式并且IFD1中的标签PhotometricInterpretation(0x0106)是'2', 则缩略图使用了 RGB 格式. 在这种情况下, 你只要简单的把数据拷贝到计算机的RGB格式 中就能看到缩略图了(如BMP 格式, 或者拷贝到 VRAM 目录下). Kodak DC-210/220/260 就使用 这个格式. 注意TIFF中存储的像素数据是'RGB' 顺序的, 而BMP 里的存储顺序则是 'BGR' .
如果这个标签的值是 '6', 缩略图使用 YCbCr 格式. 如果你想要看到缩略图的话, 你必须把它 转换成 RGB 格式的. Ricoh RDC4200/4300, Fuji DS-7/300 和DX-5/7/9 使用的是这种格式 (较新的 RDC5000/MX-X00 系列使用的是 JPEG). 在下一节中主要描述的就是Fuji DS相机的缩略图 的图像转换. 想要了解更多的信息, 请参考TIFF6.0 规格说明.
在DX-5/7/9的场合, YCbCrSubsampling(0x0212) 的值是 '2,1', PlanarConfiguration(0x011c) 的 值是 '1'. 因此这种图像的数据排列是下面的那样.
Y(0,0),Y(1,0),Cb(0,0),Cr(0,0), Y(2,0),Y(3,0),Cb(2,0),Cr(3.0), Y(4,0),Y(5,0),Cb(4,0),Cr(4,0). . . .
括 号中的数字代表的是像素坐标. DX 系列中000YCbCrCoefficients(0x0211) 的值是 '0.299/0.587/0.114', ReferenceBlackWhite(0x0214) 的值是 '0,255,128,255,128,255'. 于是把 Y/Cb/Cr 转换成 RGB 就是;
B(0,0)=(Cb-128)*(2-0.114*2)+Y(0,0)
R(0,0)=(Cr-128)*(2-0.299*2)+Y(0,0)
G(0,0)=(Y(0,0)-0.114*B(0,0)-0.299*R(0,0))/0.587
水平subsampling 的值是 '2', 因此你能使用 Y(1,0)和Cr(0,0)/Cb(0,0)计算出B(1,0)/R(1,0)/G(1,0). 根据ImageWidth(0x0100) 和ImageLength(0x0101)的值可以重复这些转换.

Exif/TIFF使用的标签数

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

IFD0 (主图像)使用的标签
标签号标签名格式组件数描述
0x010eImageDescriptionascii string用来描述图像. 双字节的字符码不能使用, 如 中文/韩文/日文.
0x010fMakeascii string表示数字相机的制造商. 在Exif 标准中, 这个标签是可选的, 但是在DCF中它是必需的.
0x0110Modelascii string表示数字相机的模块代码. 在Exif 标准中, 这个标签是可选的, 但在DCF中它也是必需的.
0x0112Orientationunsigned short1
Value0th Row0th Column
1topleft side
2topright side
3bottomright side
4bottomleft side
5left sidetop
6right sidetop
7right sidebottom
8left sidebottom
当拍照时, 相机相对于场景的方向. 在右边表示的是'0th row' 以及 '0th column' 在视觉位置上的关系.
0x011aXResolutionunsigned rational1图像的 显示/打印 分辨率. 缺省值是 1/72英寸, 但是它没有意义因为个人PC在 显示/打印 图像的时候不使用这个值.
0x011bYResolutionunsigned rational1
0x0128ResolutionUnitunsigned short1XResolution(0x011a)/YResolution(0x011b)的单位. '1' 表示没有单位, '2' 意味着英寸, '3' 表示厘米. 缺省值是 '2'(英寸).
0x0131Softwareascii string显示固件的版本号(数字相机的内部控制软件).
0x0132DateTimeascii string20图像最后一次被修改时的日期/时间. 日期的格式是 "YYYY:MM:DD HH:MM:SS"+0x00, 一共 20个字节. 如果没有设置时钟或者数字相机没有时钟, 则这个域是用空格来填充. 通常, 它和DateTimeOriginal(0x9003)具有相同的值
0x013eWhitePointunsigned rational2定义图像白点(white point/白点:在彩色分色、照相或摄影时作为色彩平衡测量用途的参考点) 的色度(chromaticity). 如果图像是用CIE标准照度 D65(著名的是 '光线/daylight'的国际标准), 这个值是 '3127/10000,3290/10000'.
0x013fPrimaryChromaticitiesunsigned rational6定义图像的原始色度. 如果图像使用 CCIR 推荐 709原始色度, 则这个值是 '640/1000,330/1000,300/1000,600/1000,150/1000,0/1000'.
0x0211YCbCrCoefficientsunsigned rational3当图像的格式是 YCbCr(JPEG的格式), 这个值表示转换成 RGB格式的一个常量. 通常, 这个值是'0.299/0.587/0.114'.
0x0213YCbCrPositioningunsigned short1当图像的格式是 YCbCr 并且使用 '子采样/Subsampling'(色度数据的剪切值, 所有的数字相机都使用), 定义了subsampling 像素阵列的色度采样点. '1'表示像素阵列的中心, '2' 表示基准点.
0x0214ReferenceBlackWhiteunsigned rational6表示黑点(black point)/白点 的参考值. 在YCbCr 格式中,前两个值是 Y的黑点/白点, 下两个值是 Cb, 最后两个值是 Cr. 而在 RGB 格式中, 前两个表示R的黑点/白点, 下两个是 G, 最后两个是 B.
0x8298Copyrightascii string表示版权信息
0x8769ExifOffsetunsigned long1Exif 子IFD的偏移量
Exif 子IFD使用的标签
标签号标签名格式组件数描述
0x829aExposureTimeunsigned rational1曝光时间 (快门速度的倒数). 单位是秒.
0x829dFNumberunsigned rational1拍照时的光圈F-number(F-stop).
0x8822ExposureProgramunsigned short1拍照时相机使用的曝光程序. '1' 表示手动曝光, '2' 表示正常程序曝光, '3' 表示光圈优先曝光, '4' 表示快门优先曝光, '5' 表示创意程序(慢速程序), '6' 表示动作程序(高速程序), '7'表示 肖像模式, '8' 表示风景模式.
0x8827ISOSpeedRatingsunsigned short2CCD 的感光度, 等效于 Ag-Hr 胶片的速率.
0x9000ExifVersionundefined4Exif 的版本号. 用4个ASCII字符来存储. 如果图片是基于Exif V2.1的, 这个值是 "0210". 因为它不是一个用NULL(0x00)来终结的字符串,所以这里的类型是 'undefined'.
0x9003DateTimeOriginalascii string20照片在被拍下来的日期/时间. 使用用户的软件是不能被修改这个值的. 日期的格式是 "YYYY:MM:DD HH:MM:SS"+0x00, 一共占用20个字节. 如果数字相机没有设置时钟或者 数字相机没有时钟, 这个域使用空格来填充. 在Exif标准中, 这个标签是可选的, 但是在 DCF中是必需的.
0x9004DateTimeDigitizedascii string20照片被数字化时的日期/时间. 通常, 它与DateTimeOriginal(0x9003)具有相同的值. 数据格式是 "YYYY:MM:DD HH:MM:SS"+0x00, 一共占用20个字节. 如果数字相机没有设置时钟或者 数字相机没有时钟, 这个域使用空格来填充. 在Exif标准中, 这个标签是可选的, 但是在 DCF中是必需的.
0x9101ComponentsConfigurationundefined表示的是像素数据的顺序. 大多数情况下RGB格式使用 '0x04,0x05,0x06,0x00' 而YCbCr 格式使用 '0x01,0x02,0x03,0x00'. 0x00:并不存在, 其他的对应关系为 0x01:Y, 0x02:Cb, 0x03:Cr, 0x04:Red, 0x05:Green, 0x06:Bllue.
0x9102CompressedBitsPerPixelunsigned rational1JPEG (粗略的估计)的平均压缩率.
0x9201ShutterSpeedValuesigned rational1用APEX表示出的快门速度. 为了转换成原始的 'Shutter Speed'; 则先要计算2的ShutterSpeedValue次幂, 然后求倒数. 例如, 如果 ShutterSpeedValue 是'4', 快门速度则是1/(24)=1/16秒.
0x9202ApertureValueunsigned rational1拍照时镜头的光圈. 单位是 APEX. 为了转换成普通的 F-number(F-stop), 则要先计算出根号2 2 (=1.4142)的ApertureValue次幂. 例如, 如果ApertureValue 是'5', F-number 就等于1.41425= F5.6.
0x9203BrightnessValuesigned rational1被拍摄对象的明度, 单位是 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.
0x9204ExposureBiasValuesigned rational1照片拍摄时的曝光补偿. 单位是APEX(EV).
0x9205MaxApertureValueunsigned rational1镜头的最大光圈值. 你可以通过计算根号2的MaxApertureValue次幂来转换成普通的光圈 F-number (跟ApertureValue:0x9202的处理过程一样).
0x9206SubjectDistancesigned rational1到焦点的距离, 单位是米.
0x9207MeteringModeunsigned short1曝光的测光方法. '0' 表示未知, '1' 为平均测光, '2' 为中央重点测光, '3' 是点测光, '4' 是多点测光, '5' 是多区域测光, '6' 部分测光, '255' 则是其他.
0x9208LightSourceunsigned short1光源, 实际上是表示白平衡设置. '0' 意味着未知, '1'是日光, '2'是荧光灯, '3' 白炽灯(钨丝), '10' 闪光灯, '17' 标准光A, '18' 标准光B, '19' 标准光C, '20' D55, '21' D65, '22' D75, '255' 为其他.
0x9209Flashunsigned short1'0' 表示闪光灯没有闪光, '1' 表示闪光灯闪光, '5' 表示闪光但没有检测反射光, '7' 表示闪光且检测了反射光.
0x920aFocalLengthunsigned rational1拍摄照片时的镜头的焦距长度. 单位是毫米.
0x927cMakerNoteundefined制造商的内部数据. 一些制造商如 Olympus/Nikon/Sanyo 等在这个区域中使用IFD 格式的数据.
0x9286UserCommentundefined存储用户的注释. 这个标签允许使用两字节的德字符或者 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
0x9290SubsecTimeascii string一些数字相机每秒能拍摄 2~30 张照片, 但是DateTime/DateTimeOriginal/DateTimeDigitized 标签只能记录到秒单位的时间. SubsecTime 标签就是用来记录秒后面的数据(微秒).
例如, DateTimeOriginal = "1996:09:01 09:15:30", SubSecTimeOriginal = "130", 合并起来的原始的拍摄 时间就是 "1996:09:01 09:15:30.130"
0x9291SubsecTimeOriginalascii string
0x9292SubsecTimeDigitizedascii string
0xa000FlashPixVersionundefined4存储FlashPix 的版本信息. 如果图像数据是基于 FlashPix formar Ver.1.0, 则这个值为 "0100". 因为它不是一个用NULL(0x00)来终结的字符串,所以这里的类型是 'undefined'.
0xa001ColorSpaceunsigned short1定义色彩空间. DCF 图像必须使用 sRGB 色彩空间因此这个值总是 '1'. 如果这个照片使用了 其他的色彩空间, 这个值是 '65535':未校准(Uncalibrated).
0xa002ExifImageWidthunsigned short/long1主图像的尺寸大小.
0xa003ExifImageHeightunsigned short/long1
0xa004RelatedSoundFileascii string如果数字相机能够纪录图像的音频数据, 则表示音频数据的名字.
0xa005ExifInteroperabilityOffsetunsigned long1表示这是一个扩展"ExifR98", 细节未知. 这个值经常是IFD格式的数据. 当前这儿有两个 目录项, 第一个是 Tag0x0001, 值是"R98", 下一个是 Tag0x0002, 它的值为 "0100".
0xa20eFocalPlaneXResolutionunsigned rational1表示CCD的像素密度. 如果你的相机是百万像素的并且是用低分辨率(如VGA模式) 来拍摄照片, 这个值可以通过照片的分辨率来重新采样. 在这种情况下, FocalPlaneResolution 就不是CCD的实际的分辨率.
0xa20fFocalPlaneYResolutionunsigned rational1
0xa210FocalPlaneResolutionUnitunsigned short1FocalPlaneXResoluton/FocalPlaneYResolution的单位. '1' 表示没有单位, '2'是英寸inch, '3' 表示厘米.
注意:一些Fujifilm的数码相机(如.FX2700,FX2900,Finepix4700Z/40i 等) 使用的值是 '3' 所以它的单位一定是 '厘米' , 但是它们的分辨率单位就变成'8.3mm?'(1/3in.?). 这是Fuji 的BUG? 从Finepix4900Z 开始这个值就使用 '2' 了但仍然跟实际的值不吻合.
0xa215ExposureIndexunsigned rational1跟ISOSpeedRatings(0x8827)一样但是数据类型是 unsigned rational. 只有Kodak的数字相机使用 这个标签来替代 ISOSpeedRating, 我不知道这是为什么(历史原因?).
0xa217SensingMethodunsigned short1表示图像传感器单元的类型. '2' 意味着这是一个芯片颜色区域传感器, 几乎所有的数字相机都 使用这个类型.
0xa300FileSourceundefined1显示图像来源. 值'0x03' 表示图像源是数字定格相机.
0xa301SceneTypeundefined1表示拍摄场景的类型. 值'0x01' 表示图像是通过相机直接拍摄出来的.
0xa302CFAPatternundefined表示色彩过滤阵列(CFA) 几何模式.
长度类型意义
2shortHorizontal repeat pixel unit = n
2shortVertical repeat pixel unit = m
1byteCFA value[0,0]
:::
1byteCFA value[n-1,0]
1byteCFA value[0,1]
:::
1byteCFA value[n-1,m-1]
色彩过滤和CFA值之间的关系.
Filter ColorRedGreenBlueCyanMagentaYellowWhite
CFA value0123456
RG
GB
例如, 普通的 RGB 过滤器使用左表的副本, 这个值是 '0x0002,0x0002,0x00,0x01,0x01,0x02'.
Interoperability IFD使用的标签
标签号标签名格式组件号描述
0x0001InteroperabilityIndexAscii string4如果这个IFD 是主图像的 IFD 并且文件内容采用的是 ExifR98 v1.0, 那这个值就是 "R98". 如果是所略图的, 这个值则是 "THM".
0x0002InteroperabilityVersionUndefined4纪录interoperability的版本. "0100" 表示版本1.00.
0x1000RelatedImageFileFormatAscii stringany纪录图像文件的文件格式. 这个值是 ascii 字符串(如. "Exif JPEG Ver. 2.1").
0x1001RelatedImageWidthShort or Long1纪录图像的大小尺寸.
0x1001RelatedImageLengthShort or Long1
IFD1 (缩略图)使用的标签
标签号标签名格式组件数描述
0x0100ImageWidthunsigned short/long1表示缩略图的大小.
0x0101ImageLengthunsigned short/long1
0x0102BitsPerSampleunsigned short3当图像格式没有经过压缩, 这个值表示每像素的比特位的数目. 通常这个值是 '8,8,8'
0x0103Compressionunsigned short1代表压缩的方式. '1' 表示非压缩, '6' 表示JPEG 压缩格式.
0x0106PhotometricInterpretationunsigned short1表示图像数据组件的色彩空间. '1' 意味着单色, '2'表示 RGB, '6' 表示 YCbCr.
0x0111StripOffsetsunsigned short/long如果图像格式没有经过压缩, 这个值表示的是到图像数据的偏移量. 在图像数据被分割的 情况下它有多个值.
0x0115SamplesPerPixelunsigned short1如果图像格式没有经过压缩, 这个值表示每个像素中存储的组件数目. 在彩色图像中, 此值为 '3'.
0x0116RowsPerStripunsigned short/long1如果图像格式没有经过压缩 并且 图像被分割存储, 这个值表示每条数据带存储了多少行数据 . 如果图像没有被分割, 它与ImageLength(0x0101)同值.
0x0117StripByteConuntsunsigned short/long如果图像格式没有经过压缩 并且 图像被分割存储, 这个值表示每条数据带使用了多少字节的 数据 且 有多个值. 如果图像没有被分割, 它只有一个且表示为图像的所有数据的大小.
0x011aXResolutionunsigned rational1图像的显示/打印分辨率. 很多的数字相机都使用1/72英寸的规格, 但对于个人PC 来讲这个值没有任何意义因为在显示/打印的时候不使用这个值.
0x011bYResolutionunsigned rational1
0x011cPlanarConfigurationunsigned short1如果图像格式是非压缩YCbCr的, 这个值表示YCbCr数据的字节对齐顺序. '1', 表示Y/Cb/Cr值是一个 chunky format, 对于每个子采样像素都是连续的. '2', 则表示Y/Cb/Cr 值被分割存储在 Y plane/Cb plane/Cr plane 格式中.
0x0128ResolutionUnitunsigned short1XResolution(0x011a)/YResolution(0x011b)的单位. '1' 表示英寸, '2' 表示厘米.
0x0201JpegIFOffsetunsigned long1当图像格式是JPEG时, 这个值表示到 JPEG 数据的偏移量.
0x0202JpegIFByteCountunsigned long1当图像格式是JPEG时, 表示JPEG 图像的数据大小.
0x0211YCbCrCoefficientsunsigned rational3当图像格式是YCbCr时, 它表示转换成RGB格式的一个常量值. 通常是'0.299/0.587/0.114'.
0x0212YCbCrSubSamplingunsigned short2当图像格式是YCbCr时 并且 使用子采样(色度数据的剪切值, 所有的数字相机都使用)时, 这个值表示有多少个色度数据被采样了. 首先第一个值表示水平的, 下一个值表示垂直的 采样率.
0x0213YCbCrPositioningunsigned short1当图像格式是YCbCr时 并且 使用子采样(色度数据的剪切值, 所有的数字相机都使用)时, 这个值定义了被采样的像素阵列的色度采样点. '1' 表示像素阵列的中心, '2' 表示基准点(0,0).
0x0214ReferenceBlackWhiteunsigned rational6表示黑点/白点的参考值. 在YCbCr 格式的情况下, 前两个表示了Y的黑/白, 下两个是 Cb, 最后两个是 Cr. 在RGB 的情况下, 前两个表示R的黑/白, 下两个是 G, 最后两个是 B.
Misc Tags
标签号标签名格式组件数描述
0x00feNewSubfileTypeunsigned long1
0x00ffSubfileTypeunsigned short1
0x012dTransferFunctionunsigned short3
0x013bArtistascii string
0x013dPredictorunsigned short1
0x0142TileWidthunsigned short1
0x0143TileLengthunsigned short1
0x0144TileOffsetsunsigned long
0x0145TileByteCountsunsigned short
0x014aSubIFDsunsigned long
0x015bJPEGTablesundefined
0x828dCFARepeatPatternDimunsigned short2
0x828eCFAPatternunsigned byte
0x828fBatteryLevelunsigned rational1
0x83bbIPTC/NAAunsigned long
0x8773InterColorProfileundefined
0x8824SpectralSensitivityascii string
0x8825GPSInfounsigned long1
0x8828OECFundefined
0x8829Interlaceunsigned short1
0x882aTimeZoneOffsetsigned short1
0x882bSelfTimerModeunsigned short1
0x920bFlashEnergyunsigned rational1
0x920cSpatialFrequencyResponseundefined
0x920dNoiseundefined
0x9211ImageNumberunsigned long1
0x9212SecurityClassificationascii string1
0x9213ImageHistoryascii string
0x9214SubjectLocationunsigned short4
0x9215ExposureIndexunsigned rational1
0x9216TIFF/EPStandardIDunsigned byte4
0xa20bFlashEnergyunsigned rational1
0xa20cSpatialFrequencyResponseunsigned short1
0xa214SubjectLocationunsigned short1