C++实现的jpeg,bmp解码器,并且实现了图片放缩的resize操作(双线性插值的方法),功能虽然实现了,但是并不高效,暂时只是为了了解一下jpeg,bmp文件的格式的解码方式,其中bmp的解码比较简单,重点是jpeg的解码流程比较复杂。
- 读取文件头信息
- 读取量化表
- 读取图片信息,采样率,每个颜色分量使用的量化表ID
- 读取哈夫曼表,建立哈夫曼树
- 读取MCU数据,对MCU直流数据进行差分解码
- 对MCU的每个颜色分量的8*8的单元,进行反量化,进行反zagzig,反向离散余弦变换
- 将YCrCb数据转换为RGB数据
- 将每个MCU解码后的RGB数据拼接为整幅图像
- 将RGB数据加上BMP的文件头,保存为BMP图像,以验证解码的正确性
执行make命令,就会有可执行文件生成,./pic_decode.bin test.jpeg test.bmp,会把jpeg和bmp的格式信息打印出来,并将jpeg文件转存为bmp文件,并resize原图像1.5倍,保存为新的图片,当然也可以在程序中更改缩放大小,执行的命令输出如下所示:
encoded jpeg data length is 25352
This is a jpeg file and open success!
************APP0 INFO*******************
本数据段的长度为:16
标识符: JFIF; 版本号:1.1
X和Y的密度单位: 1; ---注释:0:无单位;1:点数/英寸;2:点数/厘米
X方向像素密度:72; Y方向像素密度:72
缩略图水平像素数目:0; 缩略图垂直像素数目:0
该jpeg文件没有缩略图RGB位图
************DQT INFO*******************
本数据段的长度为:67
精度:8位,量化表ID:0
13 9 10 11 10 8 13 11
10 11 14 14 13 15 19 32
21 19 18 18 19 39 28 30
23 32 46 41 49 48 46 41
45 44 51 58 74 62 51 54
70 55 44 45 64 87 65 70
76 78 82 83 82 50 62 90
97 90 80 96 74 81 82 79
************DQT INFO*******************
本数据段的长度为:67
精度:8位,量化表ID:1
14 14 14 19 17 19 38 21
21 38 79 53 45 53 79 79
79 79 79 79 79 79 79 79
79 79 79 79 79 79 79 79
79 79 79 79 79 79 79 79
79 79 79 79 79 79 79 79
79 79 79 79 79 79 79 79
79 79 79 79 79 79 79 79
************SOF0 INFO*******************
本数据段的长度为:17
图片数据精度:8位精度数据
图片高度:453;图片宽度:680
图片的颜色格式为:YCrCb格式彩色图
颜色分量ID:1
水平采样因子:2
垂直采样因子:2
量化表ID:0
颜色分量ID:2
水平采样因子:1
垂直采样因子:1
量化表ID:1
颜色分量ID:3
水平采样因子:1
垂直采样因子:1
量化表ID:1
************DHT INFO*******************
本数据段的长度为:28
DC哈夫曼表; Table ID:0
0 2 3 1 1 1 1 0 0 0 0 0 0 0 0 0
************DHT INFO*******************
本数据段的长度为:65
AC哈夫曼表; Table ID:0
1 0 2 1 2 5 3 2 4 5 1 7 3 4 1 5
************DHT INFO*******************
本数据段的长度为:26
DC哈夫曼表; Table ID:1
0 3 1 1 1 1 0 0 0 0 0 0 0 0 0 0
************DHT INFO*******************
本数据段的长度为:38
AC哈夫曼表; Table ID:1
1 1 0 2 2 2 3 1 1 0 3 1 1 1 0 0
************SOS INFO*******************
本数据段的长度为:12
图片的颜色格式为:YCrCb格式彩色图
颜色分量ID:1
直流分量使用的哈夫曼表ID:0
交流分量使用的哈夫曼表ID:0
颜色分量ID:2
直流分量使用的哈夫曼表ID:1
交流分量使用的哈夫曼表ID:1
颜色分量ID:3
直流分量使用的哈夫曼表ID:1
交流分量使用的哈夫曼表ID:1
谱选择开始:0x00
谱选择结束:0x3F
谱选择:0x00
*****jpeg图像解码结束,已将bgr数据存储为二进制数据:jpeg_decoded_bgr.bin******
bmp data length is 1423594
BMP文件大小:1390kb
保留字必须为0:0
保留字必须为0:0
实际位图数据的偏移字节数: 54
位图信息头:
信息头的大小:40
位图宽度:870
位图高度:545
图像的位面数(位面数是调色板的数量,默认为1个调色板):1
每个像素的位数:24
压缩方式:0
图像的大小:0
水平方向分辨率:0
垂直方向分辨率:0
使用的颜色数:0
重要颜色数:0
*****bmp图像解码结束,已将bgr数据存储为二进制数据:bmp_decoded_bgr.bin******
*****测试:将jpeg解码的数据存储位bmp图像,验证正确性,存储文件为:jpeg_to_bmp_test.bmp******
resize use scale and scale is 1.5
resized width is 1020 height is 679
图像resize测试(双线型插值法),图像原尺寸(680,453),resize 后的尺寸为(1020,679),resize后的图像为:jpeg_resized.bmp