MPO文件类型解码(二)了解JPEG文件格式

l      DRIDefine Restart Interval,定义差分编码累计复位的间隔

u 标记代码                                2字节    固定值0xFFDD

u 包含2个具体字段:
 ①数据长度                            2字节    固定值0x0004,①~②两个字段的总长度
                                                           即不包括标记代码,但包括本字段
 MCU块的单元中的重新开始间隔
                                             2字节    设其值为n,则表示每nMCU块就有一个
                                                         RSTn标记。第一个标记是RST0,第二个是
                                                           RST1等,RST7后再从RST0重复。

如果没有本标记段,或间隔值为0时,就表示不存在重开始间隔和标记RST

l      SOSStart of Scan,扫描开始12字节

u 标记代码                         2字节    固定值0xFFDA

u 包含2个具体字段:
 ①数据长度                     2字节    ~④两个字段的总长度
                                                   即不包括标记代码,但包括本字段
 ②颜色分量数                1字节    应该和SOF中的字段⑤的值相同,即:
                                                    1:灰度图是;3YCrCbYIQ4CMYK

                                                        JFIF中使用YCrCb,故这里颜色分量数恒为3
   ③颜色分量信息
        a)颜色分量ID          1字节
        b)直流/交流系数表号1字节    4位:直流分量使用的哈夫曼树编号
                                                       4位:交流分量使用的哈夫曼树编号

  压缩图像数据
        a)谱选择开始                  1字节    固定值0x00
        b)谱选择结束                  1字节    固定值0x3F
        c)谱选择                          1字节    在基本JPEG中总为00

本标记段中,字段③应该重复出现,有多少个颜色分量(字段②),就出现多少次(一般为3次)。本段结束后,紧接着就是真正的图像信息了。图像信息直至遇到一个标记代码就自动结束,一般就是以EOI标记表示结束。

l       EOIEnd of Image,图像结束2字节

u 标记代码                  2字节    固定值0xFFD9

这里补充说明一下,由于在JPEG文件中0xFF具有标志性的意思,所以在压缩数据流(真正的图像信息)中出现0xFF,就需要作特别处理。具体方法是,在数据0xFF后添加一个没有意义的0x00。换句话说,如果在图像数据流中遇到0xFF,应该检测其紧接着的字符,如果是

10x00,则表示0xFF是图像流的组成部分,需要进行译码;

20xD9,则与0xFF组成标记EOI,则图像流结束,同时图像文件结束;

30xD0~0xD7,则组成RSTn标记,则要忽视整个RSTn标记,即不对当前0xFF和紧接的0xDn两个字节进行译码,并按RST标记的规则调整译码变量;

30xFF,则忽视当前0xFF,对后一个0xFF再作判断;

4)其他数值,则忽视当前0xFF,并保留紧接的此数值用于译码。

二、       JPEG解码过程详解

下面来详细讲述JPEG文件的解码过程。

1.读入文件的相关信息

按照上述的JPEG文件数据存储方式,把要解码的文件的相关信息一一读出,为接下来的解码工作做好准备。参考方法是,设计一系列的结构体对应各个标记,并存储标记内表示的信息。其中图像长宽、多个量化表和哈夫曼表、水平/垂直采样因子等多项信息比较重要。以下给出读取过程中的两个问题。

1)整个文件的大体结构

JFIF格式的JPEG文件(*.jpg)的一般顺序为:

SOI(0xFFD8)

APP0(0xFFE0)

[APPn(0xFFEn)]可选

DQT(0xFFDB)

SOF0(0xFFC0)

DHT(0xFFC4)

SOS(0xFFDA)

压缩数据

EOI(0xFFD9)

2)字的高低位问题

JPEG文件格式中,一个字(16位)的存储使用的是Motorola格式,而不是Intel格式。也就是说,一个字的高字节(高8位)在数据流的前面,低字节(低8位)在数据流的后面,与平时习惯的Intel格式不一样。.

你可能感兴趣的:(职场,图像,3D,结构,休闲)