我正在编写一个 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 位并转换为 base 中的整数值10 并存储为 1 个字节的字符。
任何人都可以提供有关我哪里出错的任何建议吗?
最佳答案
解决您的问题要做的第一件事是获取有关 JPEG 标准的 Pennebaker/Mitchel 书。
操作顺序为:
1) 色彩空间转换
2)FDCT
3) 量化
4) 之字形重新排序
5) 霍夫曼编码
由于您必须遵循许多规则,因此这些操作具有许多复杂性。
a) 您是否正确处理了 DC 预测器?
b) 您是否正确编码了 A/C 组件 w.r.t.零的运行?
c) 您是否尊重有关“填充零”和标记的输出流规则?
d) 您的色彩空间转换公式是否正确?它是否包括必须从每个组件中减去的 0x80?
e) 您是否根据您选择的子采样选项以正确的顺序对 MCU 块进行编码?
关于jpeg - 需要有关 BMP 到 JPEG 转换的帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1120951/