我正在编写一个C ++程序,将BMP图像转换为JPEG格式。
这是我想要遵循的基本算法:
我已经确认我正在正确执行上述操作,但我仍然遇到以下问题:
所以我们先考虑Y分量。
Y分量的DCT系数是:
495 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
量化之后,对于Y分量,我得到的单个数据单元的之字形排序就是这个。
30 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0
现在,以上之字形顺序数组的霍夫曼编码为:
我得到的最终霍夫曼代码是:
001111101010110000100111010111001长度33
因此,为了使其可被8整除,填充为1。
0011111010101100001001110101110011111111 Length 40.
这里每个单独的0或1实际上是一个需要存储在JPEG文件中的位,但由于我们无法逐位写入文件,因此总共需要8位并转换为整数基数为10的值,并存储为1字节字符。
任何人都可以就我出错的地方提出任何建议吗?
答案 0 :(得分:2)
解决问题的第一步是让Pennebaker / Mitchel书籍符合JPEG标准。
操作顺序为:
1)色彩空间转换 2)FDCT 3)量化 4)Zigzag重新排序 5)霍夫曼编码
由于您必须遵循许多规则,这些操作有许多复杂性。
a)您是否正确处理DC预测器? b)您是否正确编码了A / C组件w.r.t.零的运行? c)您是否尊重关于“填充零”和标记的输出流规则? d)您的色彩空间转换公式是否正确?它是否包含必须从每个组件中减去的0x80? e)您是否根据您选择的子采样选项以正确的顺序对MCU块进行编码?
答案 1 :(得分:-1)
不要重新发明轮子。使用ImageMagick,Magick ++或CImg来实现这一目标。