2.3、IFD:Image file directory图像文件路径
继续接着上一节介绍IFD相关的东西
IFD的directory entry结构是怎样的呢
从上面可知,前2个字节是ExifTag num号,接着2个字节是数据格式DataFormat(Ulong),后面4个字节是components个数,最后4个字节是数据值或数据值的偏移量。
IFD的数据格式情况如下,rational为小数值,包含两个整个值,第一个是分子,第二个是分母;上大面的例子中是ulong数据类型。
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/component”值大小乘以components个数可以得到整个数据大小,若是数据大小小于4个字节,dirEntry项的最后4字节写入的是tag数据值,否则就是数据的偏移量大小。下面就是一个大于4个字节的例子,数据格式类型是5,即“Bytes/component”是8,而components个数为1,其乘积大小超过4字节,从而采用写入偏移量值,406+0x0c("II"地址)+1=0x01A2,该地址里的内容是72,代表Y分辨率是72dpi。
IFD0问题包含一个特定Tag为Exif Offset(0x8769),在这个entry项的最后4字节中存放着Exif SubIFD的偏移量,Exif SubIFD也是IFD格式的数据结构,包含有一些数码信息如ISO,光圈Fn,曝光时间等等。
从下面看出Exif SubIFD里的dirEntry[5]项是光圈Fn信息,值是f2.2。
2.4、其他信息
Exif格式包含thumbnail image,一般紧临IFD1存放。thumbnail图像有3种格式,JPEG格式(JPEG使用YCbCr),RGB TIFF格式,YCbCr TIFF格式。如果IFD1里的Compression(0x0103)tag值是6,thumbnail image格式是JPEG,大部Exif image是使用JPEG格式给thumbnail,在这种情况下,从IFD1里的ThumbnailOffset(0x0201)tag里可以获取到thumbnail的偏移量,从ThumbnailLength(0x0202)tag里可以获取thumbnail的大小,数据格式是JPEG格式,即是从0xFFD8开始,到0xFFD9结束。
2.5、JPEG格式 的结构
前面有简单介绍过,JPEG格式是以0xFFD8 SOI marker开始,以0xFFD9 EOI marker结束,中间会有其他的marker及数据来组成,如下图所示,Exif使用app1 marker字段,定义量化表使用DQT marker字段,而像app5不知名的marker字段则是软件自定义的部分内容,如一些tuning数据,awb,ae参数等或其他的数据。 SOS marker字段(0xFFDA)为Start of scan的意思,在其后面就是jpeg image数据(scanData marker字段),最后就是EOI marker字段。
我们来看下其他marker字段的各个函数
Code assignment | Symbol | Description |
Start of Frame markers, non-differential, Huffman coding | ||
X’FFC0’ | SOF0 | Baseline DCT |
X’FFC1’ | SOF1 | Extended sequential DCT |
X’FFC2’ | SOF2 | Progressive DCT |
X’FFC3’ | SOF3 | Lossless (sequential) |
Start of Frame markers, differential, Huffman coding | ||
X’FFC5’ | SOF5 | Differential sequential DCT |
X’FFC6’ | SOF6 | Differential progressive DCT |
X’FFC7’ | SOF7 | Differential lossless (sequential) |
Start of Frame markers, non-differential, arithmetic coding | ||
X’FFC8’ | JPG | Reserved for additional JPEG extensions |
X’FFC9’ | SOF9 | Extended sequential DCT |
X’FFCA’ | SOF10 | Progressive DCT |
X’FFCB’ | SOF11 | Lossless (sequential) |
Start of Frame markers, differential, arithmetic coding | ||
X’FFCD’ | SOF13 | Differential sequential DCT |
X’FFCE’ | SOF14 | Differential progressive DCT |
X’FFCF’ | SOF15 | Differential lossless (sequential) |
Huffman table specification | ||
X’FFC4’ | DHT | Define Huffman table(s) |
Arithmetic coding conditioning specification | ||
X’FFCC’ | DAC | Define arithmetic coding conditioning(s) |
Restart interval termination | ||
X’FFD0’ through X’FFD7’ | RSTm* | Restart with modulo 8 count “m” |
Other markers | ||
X’FFD8’ | SOI* | Start of image |
X’FFD9’ | EOI* | End of image |
X’FFDA’ | SOS | Start of scan |
X’FFDB’ | DQT | Define quantization table(s) |
X’FFDC’ | DNL | Define number of lines |
X’FFDD’ | DRI | Define restart interval |
X’FFDE’ | DHP | Define hierarchical progression |
X’FFDF’ | EXP | Expand reference component(s) |
X’FFE0’ through X’FFEF’ | APPn | Reserved for application segments |
X’FFF7’ through X’FFFD’ | JPGn | Reserved for additional JPEG extensions |
X’FFFE’ | COM | Comment |
Reserved markers | ||
X’FF01’ | TEM* | For temporary private use in arithmetic coding |
X’FF02’ through X’FFBF’ | RES | Reserved |
Version 1 extensions | ||
X’FFF0’ | VER | Version |
X’FFF1’ | DTI | Define tiled image |
X’FFF2’ | DTT | Define tile |
X’FFF3’ | SRF | Selectively refined frame |
X’FFF4’ | SRS | Selectively refined scan |
X’FFF5’ | DCR | Define component registration |
X’FFF6’ | DQS | Define quantizer scale selection |