学习JPEG文件格式过程中看到的高质量博文, 转载过来, 谢谢博主 [lsiyun的专栏]
大概翻译了一下,非常的粗糙,慢慢修正。请高手自动飘过~
因为做图像压缩时会损失相机写入的如光圈、快门等信息,所以自己写了个图像压缩小玩意,顺便研究了一下Exif。
原文地址:Exif file format
JPEG格式和标志
JPEG文件都是以十六进制 '0xFFD8'开始,以'0xFFD9'结束。在JPEG数据中有像'0xFF**'这样的数据,这些被称为“标志”,它表示JPEG信息数据段。0xFFD8 表示SOI(Start of image 图像开始),0xFFD9表示EOI(End of image 图像结束)。这两个特殊的标志没有附加的数据,而其他的标志在标志后都带有附加的数据。基本的标志格式如下:
0xFF + 标志数字(1字节) + 数据大小(2字节) + 数据(n字节)
数据大小 (2字节) 是大端顺序表示(Motorola方式),从高字节开始。请注意“数据”包含了数据大小的描述,如果一个标志为:
FF C1 00 0C
则表示标志0xFFC1有0x000C(十进制12)个字节的数据,但是数据的大小 '12' 也包含了记录“数据大小”的字节,所以在0x000C 后面只有10个字节的数据量。
在JPEG格式中,一些标志描绘数据后,跟着的就是SOS(Start of stream 数据流开始)标志。在SOS标志之后,就是JPEG图像流,直到EOI标志终结。
SOI Marker | Marker XX size=SSSS | Marker YY size=TTTT | SOS Marker size=UUUU | Image stream | EOI Marker | ||||||
FFD8 | FFXX | SSSS | DDDD...... | FFYY | TTTT | DDDD...... | FFDA | UUUU | DDDD.... | I I I I.... | FFD9 |
Exif中使用的标志
从0xFFE0 ~ 0xFFEF 的标志是“应用程序标志”,在解码JPEG 图像的时候不是必需使用的。这些标志被用在用户应用中。例如:老款的Olympus(奥林巴斯)、canon(佳能)、casio(卡西欧)、Agfa(爱克发)的数码相机使用JFIF(JPEG档案交换格式)来存储相片的。JFIF使用APP0(0xFFE0)标志来插入数码相机的配置数据和缩略图的。
Exif也使用应用程序标志来插入数据,但是Exif使用APP1(0xFFE1)标志以避免和JFIF格式冲突。每个Exif文件格式都是从下面格式开始的:
SOI Marker | APP1 Marker | APP1 Data | Other Marker |
FFD8 | FFE1 | SSSS 457869660000 TTTT...... | FFXX SSSS DDDD...... |
从SOI(0xFFD8)标志开始,所以这是一个JPEG文件。后面随即跟着个一个APP1标志。所有的Exif数据都储存在APP1数据区中。在上表中的 "SSSS" 部分表示APP1数据(Exif 数据区域)的大小。请注意其大小"SSSS"包括大小描述"SSSS"其本身。
APP1的数据从"SSSS"后开始。第一部分是特殊数据,使用ASCII字符"Exif"和两个字节的 0x00 ,它定义了是否使用Exif。
APP1标志数据之后,是其他JPEG标志。
Exif数据结构
大略的Exif数据结构(APP1)如下。它采用了"Intel"的小端字节顺序方案,且包含JPEG格式的缩略图。总体上,Exif数据是从ASCII字符"Exif"和2个字节的0x00开始,后面就是Exif的数据了。Exif使用TIFF格式来存储数据。想知道更多关于TIFF格式内容,请浏览"TIFF6.0 specification"。
FFE1 | APP1 Marker | ||||
SSSS | APP1 Data | APP1 Data Size | |||
45786966 0000 | Exif Header | ||||
49492A00 08000000 | TIFF Header | ||||
XXXX. . . . | IFD0 (main image) | Directory | |||
LLLLLLLL | Link to IFD1 | ||||
XXXX. . . . | Data area of IFD0 | ||||
XXXX. . . . |
| Exif SubIFD | Directory | ||
00000000 | End of Link | ||||
XXXX. . . . | Data area of Exif SubIFD | ||||
XXXX. . . . |
| Interoperability IFD | Directory | ||
00000000 | End of Link | ||||
XXXX. . . . | Data area of Interoperability IFD | ||||
XXXX. . . . | Makernote IFD | Directory | |||
00000000 | End of Link | ||||
XXXX. . . . | Data area of Makernote IFD | ||||
XXXX. . . . | IFD1(thumbnail image) | Directory | |||
00000000 | End of Link | ||||
XXXX. . . . | Data area of IFD1 | ||||
FFD8XXXX. . . XXXXFFD9 | Thumbnail image |
TIFF头的格式
TIFF头指的是TIFF格式的前8个字节。前两个字节定义了TIFF数据采用何种字节顺序。如果是0x4949 = "II",表示采用"Intel"的小端字节顺序,如果为0x4d4d = ''MM",表示采用"Motorola"的大端字节顺序。例如:值'305,419,896'用十六进制表示为0x12345678.在Motorola的大端字节顺序中以0x12,0x34,0x56,0x78的顺序存储。如果采用Intel的小端字节顺序,则以0x78,0x56,0x34,0x12的顺序存储。现在来看,大多数数码相机采用Intel的方式。Ricoh(理光)采用了Motorola的方式。Sony(索尼)除了D700都采用Intel的的字节顺序。Kodak(柯达)DC200/210/240采用Motorola方式,但是DC220/260使用PowerPC却采用了Intel的方式!因此我们在获取Exif数据时,必须每次都确认它的字节顺序。虽然JPEG数据只采用Motorola方式的字节顺序,但Exif却允许采用两种方式。我不明白为什么Exif不修改字节顺序为Motorola方式。
然后的两个字节总是2个字节长度的0x002A。如果数据采用Intel的字节顺序,这两个字节为"0x2A,0x00"。如果采用Motorola的字节顺序,则为"0x00,0x2A"。TIFF头的最后4个字节是第一个IFD(Image File Directory, described in next chapter 图像文件目录,描述下一个字符)的偏移量。在TIFF格式中所有的偏移量都是从TIFF头的第一个字节("II"或者"MM")开始计算的到所在位置的字节数目,这个偏移量也不例外。通常第一个IFD是紧跟在TIFF头后面的,所以它的偏移量为'0x00000008'。
Byte align | TAG Mark | Offset to first IFD |
"I I" or "MM" | 0x002a | 0x00000008 |
IFD:图像文件目录(Image file directory )
接着TIFF头的是第一个IFD。它包含了图像信息数据。在下表中,开始的两个字节('EEEE')表示这个IFD所包含的目录实体数量。然后紧跟着就是实体对象(每个实体12个字节)。在最后一个目录实体后面有一个4字节大小的数据(表中的是'LLLLLLLL'),它表示下一个IFD的偏移量。如果这个偏移量的值是'0x00000000',就表示这个IFD是最后一个IFD。
EEEE | No. of directory entry | |||
TTTT | ffff | NNNNNNNN | DDDDDDDD | Entry 0 |
TTTT | ffff | NNNNNNNN | DDDDDDDD | Entry 1 |
. . . . . . . . . | . . . . . . | |||
TTTT | ffff | NNNNNNNN | DDDDDDDD | Entry EEEE-1 |
LLLLLLLL | Offset to next IFD |
上表中的'TTTT'(2字节)是标签号,代表各种数据。'ffff'(2字节)是数据格式。'NNNNNNNN'(4字节)是组成元素的数量。'DDDDDDDD'(4字节) 包含数据本身或者数据的偏移量。
数据格式
数据格式(上表中的'FFFF')如下表所定义的一样。"rational"表示一个分数,它包含两个signed/unsigned long integer值并且第一个为分子,第二个为分母。
Value | 1 | 2 | 3 | 4 | 5 | 6 |
Format | unsigned byte | ascii strings | unsigned short | unsigned long | unsigned rational | signed byte |
Bytes/component | 1 | 1 | 2 | 4 | 8 | 1 |
Value | 7 | 8 | 9 | 10 | 11 | 12 |
Format | undefined | signed short | signed long | signed rational | single float | double float |
Bytes/component | 1 | 2 | 4 | 8 | 4 | 8 |
你可以用组成元素的字节数('bytes/components')的值(见上表)乘以储存在'NNNNNNNN'区域中的组成元素的数量得到数据总长度。如果这个总长度小于4个字节,那么'DDDDDDDD'中的是这个标签(Tag)的值。如果总长度大于等于4个字节,'DDDDDDDD'中的是数据存储地址的偏移量。
IFD数据结构
在Exif格式中,第一个IFD是IFD0(主图像的IFD),它链接着IFD1(缩略图的IFD)后IFD链终止。带式IFD0/IFD1不包含像快门速度,焦距等任何数码相机的信息。IFD0总是包含特殊的标签(Tag)Exif的偏移量(0x8769) ,它说明道Exif SubIFD(子IFD)的偏移量。Exif SubIFD(子IFD)也是IFD的格式,它包含了数码相机的信息。、
Exif格式的扩展方案(Exif2.1/DCF)中,Exif SubIFD 包含了特殊标签 Exif互用偏移量(Exif Interoperability Offset)(0xA005)。它指向互用的IFD(Interoperability IFD)。在DCF(数码相机格式)规范中,这个标签是必须的且子IFD(SubIFD(主图像IFD))和IFD1(缩略图IFD)都可以带使用互用的IFD(Interoperability IFD)。通常,只有主图像使用带有这个标签。
一些数码相机使用IFD数据格式来表示制造商数据——制造商特殊的神秘数字区。要小心的编写程序,因为很难区分制造商数据是否使用了IFD格式。附录中有一些制造商数据的信息。
0000: 49 49 2A 00 08 00 00 00-02 00 1A 01 05 00 01 00
0010: 00 00 26 00 00 00 69 87-04 00 01 00 00 00 11 02
0020: 00 00 40 00 00 00 48 00-00 00 01 00 00 00
如果上面数据为TIFF数据的第一个部分,那么可以解释为:
头两个字节为"II",是'Intel'的字节顺序;
地址0x0004~0x0007是 is 0x08000000,IFD0从地址'0x0008'开始;
地址 0x0008~0x0009 是 0x0200,吗,IFD0有2个目录实体;
地址 0x000a~0x000b 是 0x1A01, 表示这是一个水平分辨率(XResolution)(0x011A)标签,它包含了图像的水平分辨率;
地址 0x000c~0x000d 是 0x0500,,这个值表示的格式是无符号分数(unsigned rational)(0x0005);
地址 0x000e~0x0011 是 0x01000000,,组成元素数量是'1',无符号分数(unsigned rational)的尺寸是8字节,所有数据总长度为 1 ×8 = 8字节;
数据总长度大于4个字节,所以接下的4个字节是数据的偏移量;
地址0x0012~0x0015 是 0x26000000,水平分辨率(XResolution)的数据存储在0x0026;
地址0x0026~0x0029 是 0x48000000,分子是72,地址0x002a~0x002d是0x0100000000,分母是 '1'。所以水平分辨率(XResolution)是72/1;
地址0x0016~0x0017是0x6987,下一个标签是Exif偏移(ExifOffset)(0x8769)。它的值是Exif子IFD(Exif SubIFD)的偏移量;
数据格式是0x0004,无符号长整型(unsigned long integer);
这个标签有一个元素。无符号长整型(unsigned long integer)长度为4个字节,所以数据总长度为4字节;
总数据长度等于4字节,接下的4个字节是Exif子IFD(Exif SubIFD)的偏移量;
地址0x001e~0x0021是0x11020000,Exif子IFD(Exif SubIFD)从'0x0211'开始;
这是最后一个目录实体,接下的4个字节表示下一个IFD的偏移量;
地址0x0022~0x0025 是 0x40000000,下一个IFD从'0x0040'开始。
缩略图
Exif格式包含图像的缩略图(除了Ricoh (理光)RDC-300Z)。缩略图通常在IFD1后面。共有3种格式的缩略图:JPEG格式(JPEG 使用YCbCr),RGB TIFF格式,YcbCr TIFF 格式。现在Exif 2.1 或者更高版本是推荐使用JPEG格式和160×120的缩略图。而DCF规范则必须使用JPEG格式和160×120的缩略图。
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顺序。
如果标签值为'2',那么缩略图采用YcbCr格式。如果你想查看缩略图,你必须要把它转换为RGB。Ricoh(理光)RDC4200/4300, Fuji(富士) DS-7/300 and DX-5/7/9 都是用这种格式(比较新的RDC5000/MX-X00系列使用JPEG格式)。Next section is brief description to conversion of Fuji DS's thumbnail. For more details, refer to TIFF6.0 specification.
At DX-5/7/9, YCbCrSubsampling(0x0212) has values of '2,1', PlanarConfiguration(0x011c) has a value '1'. So the data align of this image is below.
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). . . .
The numeric in parenthesis is pixel coordinates. DX series' YCbCrCoefficients(0x0211) has values '0.299/0.587/0.114', ReferenceBlackWhite(0x0214) has values '0,255,128,255,128,255'. Therefore to convert from Y/Cb/Cr to RGB is;
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
Horizontal subsampling is a value '2', so you can calculate B(1,0)/R(1,0)/G(1,0) by using the Y(1,0) and Cr(0,0)/Cb(0,0). Repeat this conversion by value of ImageWidth(0x0100) and ImageLength(0x0101).
Exif/TIFF 中使用的标签号
Exif/TIFF 中使用的标签号如下所示。如果标签的元素数量有限制,则CompoNo列就是最大允许的元素个数,如果CompoNo列为空,代表没有限制。
IFD0 中使用的标签(主图像) | |||||||||||||||||||||||||||||||
Tag No. | 标签名称 | 格式 | CompoNo | Desc. | |||||||||||||||||||||||||||
0x010e | ImageDescription (图像描述) | ascii string | 描述相片,不支持双字节的字符,如汉语、韩语、日语 | ||||||||||||||||||||||||||||
0x010f | Make (制造商) | ascii string | 数码相机制造商。在Exif标准中是可选的,但在DCF(数码相机格式)中是必需的。 | ||||||||||||||||||||||||||||
0x0110 | Model (型号) | ascii string | 数码相机型号。在Exif标准中是可选的,但在DCF(数码相机格式)中是必需的。 | ||||||||||||||||||||||||||||
0x0112 | Orientation (方向) | unsigned short | 1 |
The orientation of the camera relative to the scene, when the image was captured. The relation of the '0th row' and '0th column' to visual position is shown as right. 拍摄时的相机方向(横向还是纵向,那边朝上)。…… | |||||||||||||||||||||||||||
0x011a | Xresolution (水平分辨率) | unsigned rational | 1 | 图像显示、打印的分辨率。默认值值是每英寸72像素,但是因为个人计算机不使用这个值来显示或者打印,所以这个值没有意义。 | |||||||||||||||||||||||||||
0x011b | Yresolution (垂直分辨率) | unsigned rational | 1 | ||||||||||||||||||||||||||||
0x0128 | ResolutionUnit (分辨率单位) | unsigned short | 1 | 水平或者垂直分辨率XResolution(0x011a)/YResolution(0x011b)的单位,'1''表示没有单位,'2'表示英寸,'3'表示厘米。默认为'2'。 | |||||||||||||||||||||||||||
0x0131 | Software (软件) | ascii string | Shows firmware(internal software of digicam) version number. 固件(数码相机内软件)版本号。 | ||||||||||||||||||||||||||||
0x0132 | DateTime (日期时间) | ascii string | 20 | 图像最后修改的日期时间。日期格式为"YYYY:MM:DD HH:MM:SS" + 0x00,一共20字节。如果没有设置时钟或者数码相机没有时钟,这个区域可填充空格。通常,这个标签的值与DateTimeOriginal(0x9003)的值相同。 | |||||||||||||||||||||||||||
0x013e | WhitePoint (白点) | unsigned rational | 2 | 定义了图像白点的色度。如果图像使用CIE(国际照明委员会)标准亮度D65(被认为是‘阳光’的标准)的光源,这个值为'3127/10000,3290/10000'。 | |||||||||||||||||||||||||||
0x013f | PrimaryChromaticities (原色色度) | unsigned rational | 6 | 定义了原色的色度。如果图像使用CCIR推荐709原色方案,这个值应该为'640/1000,330/1000,300/1000,600/1000,150/1000,0/1000'。 | |||||||||||||||||||||||||||
0x0211 | (颜色空间转换矩阵系数) | unsigned rational | 3 | 当图像格式为YcbCr时,这个值包含一个与RGB格式转换的常量参数。通常,这个值为'0.299/0.587/0.114'。 | |||||||||||||||||||||||||||
0x0213 | YcbCrPositioning (YcbCr配置) | unsigned short | 1 | When image format is YCbCr and uses 'Subsampling'(cropping of chroma data, all the digicam do that), defines the chroma sample point of subsampling pixel array. '1' means the center of pixel array, '2' means the datum point. 当图像格式为YCbCr且使用部分采样(色度数据的取样,所有数码相机都会这么做)时,定义了部分抽样像素数组的色度样本点。'1'表示像素数组的中间,'2'表示基准点。 | |||||||||||||||||||||||||||
0x0214 | ReferenceBlackWhite (黑白参照值对) | unsigned rational | 6 | Shows reference value of black point/white point. In case of YCbCr format, first 2 show black/white of Y, next 2 are Cb, last 2 are Cr. In case of RGB format, first 2 show black/white of R, next 2 are G, last 2 are B. 黑白点参照值。在YcbCr格式的方案中,头2字节表示Y的黑白参照值,接下来的2字节是Cb的,最后2字节是Cr的。在RGB格式方案中,头2字节表示R的黑白参照值,接下来的2字节是G的,最后2字节是B的。 | |||||||||||||||||||||||||||
0x8298 | Copyright (版权) | ascii string | Shows copyright information 版权信息 | ||||||||||||||||||||||||||||
0x8769 | ExifOffset | unsigned long | 1 | Offset to Exif Sub IFD 子IFD的偏移量 |
Exif SubIFD(子标签)中使用的标签 | ||||||||||||||||||||||||||||||||||||||||||||||||||
Tag No. | 标签名称 | 格式 | CompoNo | Desc. | ||||||||||||||||||||||||||||||||||||||||||||||
0x829a | ExposureTime (曝光时间) | unsigned rational | 1 | 曝光时间(快门速度的倒数)。以秒为单位。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x829d | Fnumber (焦距) | unsigned rational | 1 | 获取图像使用的焦距(光圈)。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x8822 | ExposureProgram (曝光方式) | unsigned short | 1 | Exposure program that the camera used when image was taken. '1' means manual control, '2' program normal, '3' aperture priority, '4' shutter priority, '5' program creative (slow program), '6' program action(high-speed program), '7' portrait mode, '8' landscape mode. 拍摄图像时相机的曝光程序(曝光方式)。'1'表示手动控制;'2' '3'光圈优先; '4'快门优先;'5''6''7''8 | ||||||||||||||||||||||||||||||||||||||||||||||
0x8827 | ISOSpeedRatings (ISO) | unsigned short | 2 | CCD sensitivity equivalent to Ag-Hr film speedrate. | ||||||||||||||||||||||||||||||||||||||||||||||
0x9000 | ExifVersion (Exif版本) | undefined | 4 | Exif version number. Stored as 4bytes of ASCII character. If the picture is based on Exif V2.1, value is "0210". Since the type is 'undefined', there is no NULL(0x00) for termination. Exif版本号。用4字节的ASCII字符保存。如果图像基于Exif v2.1,其值为"0210"。由于类型为‘未定义’,所以结尾没有NULL(0x00)值。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x9003 | DateTimeOriginal (原始图像采集的时间) | ascii string | 20 | 原始图像采集时的时间。这个值不能被用户的程序修改。时间格式为"YYYY:MM:DD HH:MM:SS" + 0x00,共20字节。如果没有设定时钟或者数码相机没有时钟,这个区域可填充空格。在Exif标准中,这个标签是可选的,但在DCF标准中时必须的。 通常,这个标签的值与DateTimeOriginal(0x0132)的值相同。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x9004 | DateTimeDigitized (原始图像被数字化编码时的时间) | ascii string | 20 | 图像被数字化的时间。通常和DateTimeOriginal(原始图像采集的时间)(0x9003)相同。时间格式为"YYYY:MM:DD HH:MM:SS" + 0x00,共20字节。如果没有设定时钟或者数码相机没有时钟,这个区域可填充空格。在Exif标准中,这个标签是可选的,但在DCF标准中时必须的。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x9101 | ComponentsConfiguration (像素颜色构成顺序) | undefined | Shows the order of pixel data. Most of case '0x04,0x05,0x06,0x00' is used for RGB-format and '0x01,0x02,0x03,0x00' for YCbCr-format. 0x00:does not exist, 0x01:Y, 0x02:Cb, 0x03:Cr, 0x04:Red, 0x05:Green, 0x06:Bllue. 像素数据种色彩的顺序。大多数都采用RGB格式为'0x04,0x05,0x06,0x00',YcbCr格式为'0x01,0x02,0x03,0x00'的方案。0x00:不存在;0x01: Y; 0x02: Cb; 0x03: Cr; 0x04: Red,;0x05: Green; 0x06: Blue. | |||||||||||||||||||||||||||||||||||||||||||||||
0x9102 | CompressedBitsPerPixel 每个像素的压缩位 | unsigned rational | 1 | The average compression ratio of JPEG (rough estimate). JPEG的平均压缩率(粗略估计)。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x9201 | ShutterSpeedValue (快门速度APEX值) | signed rational | 1 | Shutter speed by APEX value. To convert this value to ordinary 'Shutter Speed'; calculate this value's power of 2, then reciprocal. For example, if the ShutterSpeedValue is '4', shutter speed is 1/(24)=1/16 second. 快门速度的APEX值。要来转化为平常的“快门速度”,计算方法为2的这个值为幂次方,在倒数。举例,如果ShutterSpeedValue(快门速度APEX值)为4则快门速度为1/(24)=1/16 秒。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x9202 | (光圈) | unsigned rational | 1 | The actual aperture value of lens when the image was t 获取图像时实际的光圈值。单位是APEX。要转换原始光圈,对 求这个值次幂。举例:如果ApertureValue(光圈)为'5',光圈(F-number(F-stop),)为1.41425 = F5.6。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x9203 | BrightnessValue (亮度) | signed rational | 1 | Brightness of taken subject, unit is APEX. To calculate Exposure(Ev) from BrigtnessValue(Bv), you must add SensitivityValue(Sv). 物体的亮度,单位是APEX。曝光量(EV)等于亮度(BV )加上感光度(SV)。 Ev=Bv+Sv Sv=log2(ISOSpeedRating/3.125) | ||||||||||||||||||||||||||||||||||||||||||||||
0x9204 | ExposureBiasValue (曝光补偿) | signed rational | 1 | Exposure bias(compensation) value of taking picture. Unit is APEX(EV). 拍摄时的曝光补偿(EV),单位是APEX(EV)。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x9205 | MaxApertureValue (最大光圈) | unsigned rational | 1 | Maximum aperture value of lens. You can convert to F-number by calculating power of root 2 (same process of ApertureValue:0x9202). 镜头的最大光圈。以 为底,这个值为幂,等到的值就是焦距(计算方法同ApertureValue (光圈)(0x0902)一样)。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x9206 | SubjectDistance (物距) | signed rational | 1 | Distance to focus point, unit is meter. 到焦点的距离,单位是米。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x9207 | MeteringMode 测光方式 | unsigned short | 1 | Exposure metering method. '0' means unknown, '1' average, '2' center weighted average, '3' spot, '4' multi-spot, '5' multi-segment, '6' partial, '255' other. 测光方式。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' means flash did not fire, '1' flash fired, '5' flash fired but strobe return light not detected, '7' flash fired and strobe return light detected. 0、没有使用闪光灯;1、使用闪光灯;5、闪光但没有检测到;闪光且检测到。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x920a | FocalLength (焦距) | unsigned rational | 1 | Focal length of lens used to take image. Unit is millimeter. 拍摄时焦距,单位为毫米。 | ||||||||||||||||||||||||||||||||||||||||||||||
0x927c | MakerNote (制造商标记) | undefined | Maker dependent internal data. Some of maker such as Olympus/Nikon/Sanyo etc. uses IFD format for this area. 制造商内置数据,如奥林巴斯、尼康、三洋等。这区域使用IFD格式 | |||||||||||||||||||||||||||||||||||||||||||||||
0x9286 | UserComment (用户注释) | undefined | Stores user comment. This tag allows to use two-byte character code or unicode. First 8 bytes describe the character code. 'JIS' is a Japanese character code (known as Kanji). 储存用户注释。这个标签允许使用双字节字符或Unicode。前8个字节指示字节编码。'JIS'是日本字符编码(日本汉字)。 | |||||||||||||||||||||||||||||||||||||||||||||||
0x9290 | SubsecTime (亚秒时间) | ascii string | Some of digicam can take 2~30 pictures per second, but DateTime/DateTimeOriginal/DateTimeDigitized tag can't record the sub-second time. SubsecTime tag is used to record it. 一些数码相机可以在一秒钟内拍摄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 (FlashPix版本) | undefined | 4 | Stores FlashPix version. If the image data is based on FlashPix formar Ver.1.0, value is "0100". Since the type is 'undefined', there is no NULL(0x00) for termination. 储存FlashPix版本。如果图像数据是基于FlashPix Ver1.0,那么这个值就是"0100"。由于类型是‘未定义’,所以结尾没有NULL(0x00)。 | ||||||||||||||||||||||||||||||||||||||||||||||
0xa001 | ColorSpace (色彩空间) | unsigned short | 1 | Defines Color Space. DCF image must use sRGB color space so value is always '1'. If the picture uses the other color space, value is '65535':Uncalibrated. 定义色彩空间。DCF图像必须使用sRGB色彩空间,其值为'1'。如果图像使用其他色彩空间,其值为'65535':非标准。 | ||||||||||||||||||||||||||||||||||||||||||||||
0xa002 | ExifImageWidth (图宽) | unsigned short/long | 1 | Size of main image. 主图像的尺寸。 | ||||||||||||||||||||||||||||||||||||||||||||||
0xa003 | ExifImageHeight (图高) | unsigned short/long | 1 | |||||||||||||||||||||||||||||||||||||||||||||||
0xa004 | RelatedSoundFile (相关音频文件) | ascii string | If this digicam can record audio data with image, shows name of audio data. 如果数码相机记录了图像的音频数据,音频数据的名称保存在这个标签。 | |||||||||||||||||||||||||||||||||||||||||||||||
0xa005 | ExifInteroperabilityOffset | unsigned long | 1 | Extension of "ExifR98", detail is unknown. This value is offset to IFD format data. Currently there are 2 directory entries, first one is Tag0x0001, value is "R98", next is Tag0x0002, value is "0100". "ExifR98"的扩展,细节未知。这个值IFD格式数据的偏移量。目前有两个目录实体,第一个是标签0x0001,值为"R98"。第二个是标签0x0002,值为"0100"。 | ||||||||||||||||||||||||||||||||||||||||||||||
0xa20e | FocalPlaneXResolutio (水平分辨率) | unsigned rational | 1 | Pixel density at CCD's position. If you have MegaPixel digicam and take a picture by lower resolution(e.g.VGA mode), this value is re-sampled by picture resolution. In such case, FocalPlaneResolution is not same as CCD's actual resolution. CCD上的像素密度。如果一台百兆像素相机使用较低的分辨率(如VGA模式),此值是图像分辨率的重新取样。在一些情况中,FocalPlaneResolution(分辨率)与CCD的实际分辨率不同。 | ||||||||||||||||||||||||||||||||||||||||||||||
0xa20f | FocalPlaneYResolution (垂直分辨率) | unsigned rational | 1 | |||||||||||||||||||||||||||||||||||||||||||||||
0xa210 | FocalPlaneResolutionUnit (分辨率单位) | unsigned short | 1 | Unit of FocalPlaneXResoluton/FocalPlaneYResolution. '1' means no-unit, '2' inch, '3' centimeter.
FocalPlaneXResoluton(水平分辨率)、FocalPlaneYResolution(垂直分辨率)的单位。1、无单位;2、英寸;3、厘米。 注意:一些富士的数码相机(例如FX2700、FX2900、Finepix4700/40i等)的值为3,所以单位是‘厘米’,但实际上使用了'8.3mm'(1/3in.?)作为其单位。这是富士相机的BUG?Finepix4900Z已改此值使用2 ,但是还是没有同实际的值相吻合。 | ||||||||||||||||||||||||||||||||||||||||||||||
0xa215 | ExposureIndex (曝光量) | unsigned rational | 1 | Same as ISOSpeedRatings(0x8827) but data type is unsigned rational. Only Kodak's digicam uses this tag instead of ISOSpeedRating, I don't know why(historical reason?). 与ISOSpeedRatings(0x8827)(ISO)的值相同,但用(unsigned rational)无符号分数表示。只有柯达的数码相机使用这个标签而不用ISOSpeedRating(ISO)。 | ||||||||||||||||||||||||||||||||||||||||||||||
0xa217 | SensingMethod (传感方式) | unsigned short | 1 | Shows type of image sensor unit. '2' means 1 chip color area sensor, most of all digicam use this type. 图像传感器单位类型。2表示1个彩色区域传感器芯片,大多数数码相机使用这种类型。 | ||||||||||||||||||||||||||||||||||||||||||||||
0xa300 | FileSource (文件源) | undefined | 1 | Indicates the image source. Value '0x03' means the image source is digital still camera. 指出图像源。'0x03'表示图像源是数码相机。 | ||||||||||||||||||||||||||||||||||||||||||||||
0xa301 | SceneType (场景类型) | undefined | 1 | Indicates the type of scene. Value '0x01' means that the image was directly photographed. 指明场景的类型。值为'0x01'表示图像时直接拍摄。 | ||||||||||||||||||||||||||||||||||||||||||||||
0xa302 | CFAPattern | undefined | Indicates the Color filter array(CFA) geometric pattern. 指明色彩滤镜矩阵(CFA)几何样式
CFA的值表示的色彩滤镜如下表:
For example, ordinary RGB filter uses the repetition of left chart, the value is '0x0002,0x0002,0x00,0x01,0x01,0x02'.
距离说明:一个普通RGB滤镜使用了左图的滤镜,他的值就为:'0x0002,0x0002,0x00,0x01,0x01,0x02'。 |
互用(Interoperability) IFD中使用的标签 | ||||
Tag No. | 标签名称 | 格式 | CompoNo | Desc. |
0x0001 | InteroperabilityIndex (互用索引) | Ascii string | 4 | If this IFD is main image's IFD and the file content is equivalent to ExifR98 v1.0, the value is "R98". If thumbnail image's, value is "THM". 如果这个IFD是主图像的IFD且文件内容与EixfR98 V1.0相当,那么值为"R98"。如果是缩略图的IFD,值为"THM"。 |
0x0002 | InteroperabilityVersion (互用版本) | Undefined | 4 | Records the interoperability version. "0100" means version 1.00. 记录互用版本。"0100"表示V1.00。 |
0x1000 | RelatedImageFileFormat (图像文件格式) | Ascii string | any | Records the file format of image file. Value is ascii string (e.g. "Exif JPEG Ver. 2.1"). 记录图像的文件格式。值为ASCII字符串 (例如:"Exif JPEG Ver.2.1") |
0x1001 | RelatedImageWidth (图像宽度) | Short or Long | 1 | Records the image size. 图像尺寸 |
0x1001 | RelatedImageLength (图像高度) | Short or Long | 1 |
IFD1 (缩略图)中使用的标签 | ||||
Tag No. | 标签名称 | 格式 | CompoNo | Desc. |
0x0100 | ImageWidth (图像宽度) | unsigned short/long | 1 | Shows size of thumbnail image. 缩略图的尺寸 |
0x0101 | ImageLength (图像高度) | unsigned short/long | 1 | |
0x0102 | BitsPerSample (分量位数) | unsigned short | 3 | When image format is no compression, this value shows the number of bits per component for each pixel. Usually this value is '8,8,8' 当图像采用未压缩的格式时,这个值表示每个分量用几个字节表示。通常这个值为'8,8,8'。 |
0x0103 | Compression (压缩) | unsigned short | 1 | Shows compression method. '1' means no compression, '6' means JPEG compression. 压缩方法。1、不压缩;6、JPEG压缩。 |
0x0106 | PhotometricInterpretation (色彩空间) | unsigned short | 1 | Shows the color space of the image data components. '1' means monochrome, '2' means RGB, '6' means YCbCr. 图像的色彩空。1、黑白;2、RGB;6、YcbCr。 |
0x0111 | StripOffsets | unsigned short/long | When image format is no compression, this value shows offset to image data. In some case image data is striped and this value is plural. 当图像为非压缩格式时,这个值表示图像数据的偏移量。在一些时候,图像数据是带状存储的,这个值不止一个。 | |
0x0115 | SamplesPerPixel (每像素分量) | unsigned short | 1 | When image format is no compression, this value shows the number of components stored for each pixel. At color image, this value is '3'. 当图像采用未压缩格式的时候,这个值表示每个像素中的分量个数。彩色图像的值为3。 |
0x0116 | RowsPerStrip | unsigned short/long | 1 | When image format is no compression and image has stored as strip, this value shows how many rows stored to each strip. If image has not striped, this value is the same as ImageLength(0x0101). 当图像格式是非压缩的且图像带状存储,这个值就表示每带存储多少行。如果图像不是带状存储的,这个值等于图像高度ImageLength(0x0101)。 |
0x0117 | StripByteConunts | unsigned short/long | When image format is no compression and stored as strip, this value shows how many bytes used for each strip and this value is plural. If image has not stripped, this value is single and means whole data size of image. 当图像未压缩并以带状存储时,这个值表示每带有多少直接且此值不止一个。如果图像不是带状存储,这个值只有一个且表示整个图像的尺寸。 | |
0x011a | Xresolution (水平分辨率) | unsigned rational | 1 | Display/Print resolution of image. Large number of digicam uses 1/72inch, but it has no mean because personal computer doesn't use this value to display/print out. 图像显示或者打印的分辨率。大部分数码相机为1/72英寸,但是因为计算年不按这个值来答应和显示图像,所以此值没有意义。 |
0x011b | Yresolution (垂直分辨率) | unsigned rational | 1 | |
0x011c | PlanarConfiguration (平面配置) | unsigned short | 1 | When image format is no compression YCbCr, this value shows byte aligns of YCbCr data. If value is '1', Y/Cb/Cr value is chunky format, contiguous for each subsampling pixel. If value is '2', Y/Cb/Cr value is separated and stored to Y plane/Cb plane/Cr plane format. 当图像格式是不压缩的YcbCr时,这个值表示YcbCr数据的排列顺序。1表示Y/Cb/Cr是紧凑格式,一像素数据相连。2表示Y/Cb/Cr值分开存储,以Y平面、Cb平面、Cr平面存储。 |
0x0128 | ResolutionUnit (分辨率单位) | unsigned short | 1 | Unit of XResolution(0x011a)/YResolution(0x011b). '1' means inch, '2' means centimeter. 分辨率(XResolution(0x011a)/YResolution(0x011b))的单位。1、英寸;2、厘米。 |
0x0201 | JpegIFOffset (Jpeg偏移量) | unsigned long | 1 | When image format is JPEG, this value show offset to JPEG data stored. 当图像格式为JPEG时的JPEG数据偏移量。 |
0x0202 | JpegIFByteCount (Jpeg数据字节数) | unsigned long | 1 | When image format is JPEG, this value shows data size of JPEG image. 当图像格式为JPEG时,这个值表示JPEG图像数据有多少个字节。 |
0x0211 | YcbCrCoefficients (YcbCr系数) | unsigned rational | 3 | When image format is YCbCr, this value shows constants to translate it to RGB format. In usual, '0.299/0.587/0.114' are used. 当图像为YcbCr格式时,这个值表示转换为RGB时的常量参数。通常这个值为'0.299/0.587/0.114'。 |
0x0212 | YcbCrSubSampling (YcbCr子抽样) | unsigned short | 2 | When image format is YCbCr and uses subsampling(cropping of chroma data, all the digicam do that), this value shows how many chroma data subsampled. First value shows horizontal, next value shows vertical subsample rate. 当图像为YcbCr格式且二次抽样(裁剪色度数据,所有的数码相机都这么做)时,这个值表示有多少色度信息被二次抽样。第一个值是水平方向的、第二个值是垂直方向的抽样率。 |
0x0213 | YcbCrPositioning (YCbCr抽象点) | unsigned short | 1 | When image format is YCbCr and uses 'Subsampling'(cropping of chroma data, all the digicam do that), this value defines the chroma sample point of subsampled pixel array. '1' means the center of pixel array, '2' means the datum point(0,0). 当图像为YcbCr格式且二次抽样(裁剪色度数据,所有的数码相机都这么做)时,这个值定义了子抽样中的色度样本点在像素数组中的位置。1、像素数组中心;2、基准点(0,0)。 |
0x0214 | ReferenceBlackWhite (黑白参照值对) | unsigned rational | 6 | Shows reference value of black point/white point. In case of YCbCr format, first 2 show black/white of Y, next 2 are Cb, last 2 are Cr. In case of RGB format, first 2 show black/white of R, next 2 are G, last 2 are B. 黑白点参照值。在YcbCr格式的方案中,头2字节表示Y的黑白参照值,接下来的2字节是Cb的,最后2字节是Cr的。在RGB格式方案中,头2字节表示R的黑白参照值,接下来的2字节是G的,最后2字节是B的。 |
Misc Tags | ||||
Tag No. | Tag Name | Format | CompoNo | Desc. |
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 |