Exif格式分析


JPEG

格式

    0xFFD8:    SOI(start of image)

    0xFF**:    JPEG信息数据段(Exif信息的位置

    SOS:Start of stream

    0xFFD9:    EOI(end of image)

    0xFFEO-0xFFEF:    应用程序标志,用在用户的应用程序中,在解码JPEG格式的图片时不是必须的。

    JPEG格式采用mototota字节顺序,其中的Exif部分却可以采用这两种方式


JFIF (JPEG档案交换格式)

    0xFFE0:(APP0)相机的配置数据和缩略图标志


Exif    (Exchangeable Image File 使用TIFF格式来存储数据)

格式

    FFD8:SIO

    FFE1:APP1 MARKER

    APP1 SIZE

    APP1 DATA

    Other Marker:    ...

    ...

    0xFFE1(APP1):插入数据的应用程序标志

    该格式包含缩略图信息


TIFF

格式

    TIFF头(TIFF格式的前8个字节)

        1-2:决定采用何种字节顺序,0x4949(ll)代表intel小端字节顺序,0X4d4d(MM)代表motorola大端字节顺序

        3-4:0x2A,0x00或者0x00,0x2A

        5-8:第一个IFD偏移量(一般是:0x00000008)

    第一个IFD(IF0):

        1-2:这个IFD包含的目录实体数量

        3-...:实体

            3-14:第一个目录实体12个字节

                3-4:标签号2个字节

                5-6:数据格式2个字节【数据格式表 1-0】

                7-10:组成元素的数量4个字节【计算总长度 1-1】

                11-14:数据本身或者数据的偏移量

            15-26:第二个目录实体12个字节  

             ...            

        

    下一个IFD的偏移量:4个字节大小

    第二个IFD:

    ...

    0x00000000:这个偏移量出现了...

    最后一个IFD

案例一:一些数码相机使用IFD数据格式来表示制造商数据【1-1】

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 

解读:

49 49:    采用intel的小端字节顺序(大多数数码相机采用这种方式)                                                                         0x0000-0x0001    

2A 00:    因为前一个字节是49 49,这个字段是必选项                                                                                                  0x0002-0x0003

08 00 00 00:    第一个IFD(图像文件目录)的起始地址(这个地址对应下一个字节)                                                 0x0004-0x0007 

02 00:    IFD0有两个字节                                                                                                                                                    0x0008-0x0009 

1A 01:    标签-水平分辨率标签                                                                                                                                          0x000a-0x000b 

05 00:    格式-无符号分数(每个占8个字节)                                                                                                                 0x000c-0x000d 

01 00 00 00:    组成元素的数量:1.由于采用intel方式,所有想要读出16进制的数字需要按照 4 3 2 1的字节        0x000e-0x0011 

                        顺序重新排列得  到 0x00000001    ,数据中长度大于4个字节,因此后面4个字节为偏移量           

26  00 00 00:    偏移量-重新排列得到0x00000026,这个是水平分辨率的首地址                                                        0x0012-0x0015 

69 87:    标签-EXIF偏移                                                                                                                                                      0x0016-0x0017 

04 00:    0x0004 ,表示 数据格式-无符号长整型(四个字节)                                                                                        0x0018-0x0019 

01 00 00 00:    组成元素数量-1                                                                                                                                           0x001a-0x001d 

11 02 00 00:    Exif SubIFD偏移量实际值(0x00000211 表示 Exif SubIFD首地址)                                                   0x001e-0x0021 

40  00 00 00:    下一个IFD从0x00000040开始                                                                                                                   0x0022-0x0025 

48 00-00 00:    水平分辨率分子0x00000048,即72                                                                                                             0x0026-0x0029 

01  00 00 00:     水平分辨率分母0x00000001,即1,因此水平分辨率为72/1                                                                  0x002a-0x002d 


 缩略图

JPEG缩略图(Exif2.1规范推荐格式)

     IFD1

        0x0103:6     压缩标签

        0x0201:    偏移量标签

        0x0202:    大小标签

       注: IFD1中可以观察到缩略图的偏移量标签(JpegIFOffset 0x0201)及 大小标签(JpegIFByteCount 0x0202),为普通的JPEG 格式

TIFF格式

第一种情况:

    IFD1

        0x0103:1    压缩标签(非压缩采用TIFF格式)

        0x0111:    StripOffset标签   起点数据

        0x0117:    StripByteCount标签 缩略图大小

第二种情况:

    IFD1

        0x0103:1    压缩标签(非压缩采用RGB格式)

        0x0106:   2

        0x0111:    StripOffset标签   起点数据

        0x0117:    StripByteCount标签 缩略图大小

第三种情况:

       IFD1

        0x0103:2    压缩标签(压缩采用YcbCr格式)

        0x0106:   2

        0x0111:    StripOffset标签   起点数据

        0x0117:    StripByteCount标签 缩略图大小


原文地址:https://www.cnblogs.com/eli01/p/3559893.html