jpeg渐进式解码

        jpeg图片有两种压缩形式,一种标准形式(baseline),另一种是渐进式(progressive),前面有解析过标准形式的解压过程(https://mp.csdn.net/mp_blog/creation/editor/104698595),这里补充一下渐进式的解压过程。

        渐进式图片是分多次分别压缩不同分量(Y/Cb/Cr)的不同部分,目前我看到的一般都是按7轮和10轮进行压缩的

        下面是一张经过10轮压缩的图片的压缩过程:

comp    Ss    Se    Ah    Al
3    0    0    0    1    
1    1    5    0    2    
1    1    63    0    1    
1    1    63    0    1    
1    6    63    0    2    
1    1    63    2    1    
1    0    0    1    0    
1    1    63    1    0    
1    1    63    1    0    
1    1    63    1    0

第一轮:3通道(Y/Cb/Cr),Z排序后0~0编号的数据,不包括最低1bit

第二轮:1通道(Y),1~5编号的数据,不包括最后2bit

第三轮:1通道(Cb),1~63编号的数据,不包括最后1bit

第四轮:1通道(Cr),1~63编号的数据,不包括最后1bit

第五轮:1通道(Y),6~63编号的数据,不包括最后2bit

第六轮:1通道(Y),1~63编号的数据,只有倒数第2bit数据

第七轮:1通道(Y),0~0编号的数据,只有倒数第1bit数据

第八轮:1通道(Y),1~63编号的数据,只有倒数第1bit数据

第九轮:1通道(Cb),1~63编号的数据,只有倒数第1bit数据

第十轮:1通道(Cr),1~63编号的数据,只有倒数第1bit数据

下面是解压渐进式图片的具体过程,大体和标准式的差不多

图片数据(数据太大,这里只有前面一部分)

FFD8FFE000104A46494600010100000100010000FFDB00430008050607060508070607090808090C130C0C0B0B0C1811120E131C181D1D1B181B1A1F232C251F212A211A1B2634272A2E2F3132311E25363A36303A2C303130FFDB0043010809090C0A0C170C0C1730201B203030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030FFC20011080200028003012200021101031101FFC4001B00000301010101010000000000000000000102030004050607FFC4001801010101010100000000000000000000000001020304FFDA000C03010002100310000001FA7DB76CEC351C3070C1180C060E183860E1838636183860E1838608183860E183970D8608182570C060E183860E006CA4D86095C301A8E1823046C3070C1C00D815C084DB6360576D8C418A6D8D8608D823636C03860E18DB63604DB0AC468DB636D8D860E1823636D8DB0A38682360E1823636D8D8608D82363618257530D8DB043860E183860E18254A9C3070C1C0981C020C3EE7357DCF92FA18BE805E8DCF8E8DCF8E810C740864BEE7CBD1A013A373E5E810C97D0C5F7392FA00E810C5CF3E3A0432DF4325F73E3A37392E238B6882FA18BEE7C740862FA18BE863A04317D00746E7C740862E220BEE7C9D1B9B5BD3B974766E3076EE015E8EF3CC779E1CAFA3ACAE904B6905B6902BA58AE904B6902DA38B0962C240B68E2DA38B6862DA38B68E2DA20BE8E5B68E4B0902DA38B6863A3409611C574495D1C5B4716D1C5B4716112574716D1D56D031612D551252DA18B8902A24A574495D22502897A426AA04094C80A6988A69957082CA89E299014D2C574B14C816A2612BA44A6911CCB14320544F1513C534B15D223E9E2BA78A89E2829CF2D0C8D8E170E1314D3C504C8E130E6787D361C4F0E100E6669C22C502E56D336300AB5683A7414D2B0503E4C314C385C8D942B05C502619A7928108C02ABE4C3E9947CA42B80D940C57072E1B261F2818A61F2E18295B4EDCF04A6A669E46CA0A040532AAB94C3846439485701B2EA6C

1、图片起始标识SOI (start of image)

(1)示例数据:FF D8

(2)地址:0x00000000

(3)FF D8 图片起始标志

  1. Application Marker (JFIF采用FFE0开头,Exif采用FFE1开头,一般老式相机采用JFIF格式),解码不需要用到该数据段

(1)示例数据:FF E0 00 10 4A 46 49 46 00 01 01 00 00 01 00 01 00 00

(2)地址:0x00000002

(3)FF E0 Application Marker起始标识

(4)00 10 数据段长度:16(包括长度数据本身)

(5)4A 46 49 46 00 表示JFIF.

(6)01 JFIF主版本号1

(7)01 JFIF次版本号1

(8)00 图像密度单位0(0:无单位  1:点数/英寸 2:点数/厘米)

(9)00 01 X方向像素密度1

(10)00 01 Y方向像素密度1

(11)00 缩略图水平像素数目

(12)00 缩略图垂直像素数目

  1. 量化表(Define Quantization Tabel(s))

  1. 示例数据:FF DB 00 43 00 08 05 06 07 06 05 08 07 06 07 09 08 08 09 0C 13 0C 0C 0B 0B 0C 18 11 12 0E 13 1C 18 1D 1D 1B 18 1B 1A 1F 23 2C 25 1F 21 2A 21 1A 1B 26 34 27 2A 2E 2F 31 32 31 1E 25 36 3A 36 30 3A 2C 30 31 30 FF DB 00 43 01 08 09 09 0C 0A 0C 17 0C 0C 17 30 20 1B 20 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30
  2. 地址:0x00000014
  3. 00 43 数据长度67,包括本字段
  4. 00 QT信息,高4位:0,QT精度为8位,否则16位;

低4位:0,QT号,有两张QT,亮度和色度

  1. 后面64字节是8×8的量化表,Z排列方式
  2. 后面还有一张量化表,QT号为1,同理

jpeg渐进式解码_第1张图片

jpeg渐进式解码_第2张图片

  1. Huffman信息

  1. 示例数据:FF C2 00 11 08 02 00 02 80 03 01 22 00 02 11 01 03 11 01
  2. 地址:0x0000009E
  3. FF C2 渐进式huffman信息
  4. 00 11 数据长度17
  5. 08 数据精度,表示每个颜色每个像素的位数,通常是8
  6. 02 00 图片高度:512
  7. 02 80 图片宽度:640
  8. 03 通道数(component),灰度图为1,YCbCr/YIQ彩色图是3,CNWK彩色图是4
  9. 01 22 00

02 11 01

03 11 01

接下来是每个通道的参数,这里有3组,每组3个字节:第1个字节01是component ID,第2个字节0-3bit是垂直采样系数,4-7bit是水平采样系数,第3个字节00量化表编号

  1. Huffman表(DHT, Define Huffman Table(s))

  1. 示例数据:FF C4 00 1B 00 00 03 01 01 01 01 01 00 00 00 00 00 00 00 00 00 01 02 03 00 04 05 06 07
  2. 地址:0x000000B1
  3. FF C4 Huffman起始标识
  4. 00 1B 数据长度为27
  5. 00 表示第一个DHT表,类型为DC,ID为0,低4位是 HT ID 号,第5位是 HT 表类型标记,再高三位是为0

(6)后面的16个字节数据表示每个编码组中有几个代码,然后是对应保存的值

组号

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

个数

00

03

01

01

01

01

01

00

00

00

00

00

00

00

00

00

后续数据为对应的值,即Haffman表为:

序号

码字长度

码字(二进制)

权值(数据位数)

0

2

00

1

1

2

01

2

2

2

10

3

3

3

110

0

4

4

1110

4

5

5

11110

5

6

6

111110

6

7

7

1111110

7

  1. Huffman表(DHT, Define Huffman Table(s))

(1)示例数据:FF C4 00 18 01 01 01 01 01 01 00 00 00 00 00 00 00 00 00 00 00 00 01 02 03 04

(2)地址:0x000000CE

(3)FF C4 Huffman起始标识

(4)00 18 数据长度为24

(5)01 表示第一个DHT表,类型为DC,ID为1,低4位是 HT ID 号,第5位是 HT 表类型标记,再高三位是为0

(6)后面的16个字节数据表示每个编码组中有几个代码,然后是对应保存的值

你可能感兴趣的:(算法学习,算法)