由于懒和人的忘性,以前做的一些笔记再回过头看时又有些生疏了,我决定把一些内容整理出来,以供有需要的来参考。

了解的人知道其价值所在,不知道的人就弃之如废物吧。

  本篇是JPEG解码系列的第一篇——JPEG文件格式概览。

1. 图片文件的数据是什么?

  这是一幅人眼可视的图片

  

  这是其对应的二进制数据:(由于二进制数据量浩如烟海,只截取头部的一些数据,使用的工具是WinHex)

  

 2. 为什么需要文件格式来表达图像?

  这就凸显了规范的重要性,使用同一套标准,各厂商都按照这个标准进行文件格式封装,那么你拿到别人的照片后就知道

了如何进行(文件格式)解析和(jpeg)解码了。

  这也好理解,不同国家不同语言的人们如何交流?使用通用的标准——英语。

  jpeg文件格式也自有其标准,文件格式标准参考电联的JFIF,编解码标准参考电联的ITU-T81。

3. 标准文档太长,没耐心读下去,怎么办?

  标准规范的页码都是很长的,用于照顾到各个角落和细节。

  但是,各个厂商实现时,肯定不会实现规范的全部内容,只需满足标准中最重要的一部分即可。

4. jpeg二进制数据解读

  一般情况下,是按照这个顺序排列的:

TAG类型 数值 名称 其他备注
SOI 0xFFD8 Start of Image 必带
APP0 0xFFE0 application0 必带
APPn 0xFFEn applicationn 可选带(APP1一般为Exif信息)
DQT 0xFFDB Define Quantization Table 必带
SOF 0xFFC0 Start of Frame 必带
DHT 0xFFC4 Define Huffman Table 必带
SOS 0xFFDA Start of Scan 必带
compress data 。。。 。。。 必带
EOI 0xFFD9 End of Image 必带

 

 

 

 

 

 

 

 

 

 

 

 

  如下为标注各种类型TAG,其中EOI在文件末尾未贴出来:

  

5. 关于各TAG的一些说明

  5.1) 文件名末尾.jpg不代表真的是一个jpeg图片,因为你可以随意更改一个文件的后缀名。

  5.2)JPEG文件必须以0xFF DB开头和以0xFF D9结尾。

  5.3)DQT为量化表,该类型表有两个表,一个表示Y分量的量化表,另外一个为UV分量共用的量化表。

    其中,TAG后面的0x 00 43表示这个TAG组中除去TAG两个字节外,共有多少个字节组成,后面的0x00为第几张表。

    量化表为DCT变换系数,由于是8x8的二维DCT变换,故系数个数为64,这也即是:0x43 - 3 = 0x40 = 64。

  5.4)SOF为帧图像开始,记录了采样精度、图形宽/高、分量个数、水平/垂直采样因子、量化表号等信息。

        例如,摘抄下SOF下的这几个字节:0x00 11 08 02 D0 03 E0 03 01 22 00 02 11 01 03 11 01

       其中,0x00 11代表SOF下共有17字节;

       0x08代表采样精度,几乎都是用8位进行采样精度,即一个像素点可以有2^8=256级过渡;

       0x02 D0代表图像高,即0x02d0=720像素高;

       0x03 E0代表图像宽,即0x03E0=992像素宽;

       0x03代表分量表数,为3,分别代表Y、U和V的表;

       0x01 22 00中第一个字节01代表量化表序号(从1开始),第二个22代表水平/垂直采样因子(高四位为水平采样因子,第四位为垂直采样因子),第三个00代表量化表id=0;

       0x02 11 01中第一个字节01代表量化表序号为2,第二个11代表水平/垂直采样因子都为1,第三个00代表量化表id=1;

       0x03 11 01中第一个字节01代表量化表序号为3,第二个11代表水平/垂直采样因子都为1,第三个00代表量化表id=2;

    需要补充说明一下,采样因子和量化表的问题。

    采样因子:该图象的Y分量的宽/高采样因子都为2,而UV分量的采样因子都为1,则在同一个方向上(水平或垂直方向),Y分量采样点是UV分量采样点的2倍,

         如果图像Y分量宽高分别W和H,那么U和V分量只采样了W/2和H/2个点,这也代表原始图象的size=1.5*W*H。

         有些图像的第一张表可能是2和1或1和2,再或都是1,但是第二和第三张表的采样因子都是1。

    量化表:Y分量使用一张量化表,UV分量使用另外一张表,因为DQT表一般就两张。

  5.5)DHT为霍夫曼表,由四个表组成,分表代表:

    [0][0]——直流霍夫曼表0,Y分量直流部分解码时使用

    [0][1]——直流霍夫曼表0,UV分量直流部分解码时使用

    [1][0]——交流霍夫曼表0,Y分量交流部分解码时使用

    [1][1]——交流霍夫曼表1,UV分量交流部分解码时使用

  5.6)SOS为扫描开始,其代表霍夫曼表关系进行映射。

  5.7)SOS后面就为真正的编码数据,这是数据的大头,相比于此,文件头的size其实是非常之少。

  5.8)EOI为图像结束的标志,图像必须以此结束。