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)示例数据: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 缩略图垂直像素数目
低4位:0,QT号,有两张QT,亮度和色度
02 11 01
03 11 01
接下来是每个通道的参数,这里有3组,每组3个字节:第1个字节01是component ID,第2个字节0-3bit是垂直采样系数,4-7bit是水平采样系数,第3个字节00量化表编号
(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)示例数据: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个字节数据表示每个编码组中有几个代码,然后是对应保存的值