BMP转JPEG转换需要帮助

4
我正在编写一个 C++ 程序,将 BMP 图像转换为 JPEG。
以下是我尝试遵循的基本算法:
1. 将 RGB 颜色空间转换为 Y、Cb、Cr。 2. 对 Cb 和 Cr 进行 2 倍下采样(这意味着对于每个 2*2 的正方形块,有 4 个不同的 Y 值,但只有 1 个 Cb 和 1 个 Cr 值)。 3. 对每个 8*8 像素的数据单元应用 DCT... 4. 然后使用 Cb 和 Cr 的标准量化表对 DCT 系数进行量化。 5. 进行蛇形扫描排序。 6. 分别使用哈夫曼编码对 DC 和 AC 系数进行编码。 7. 编写正确的文件头,并将哈夫曼编码值写入文件...
我已经验证了我正确地执行了上述步骤,但仍然存在以下问题:
1. 生成的 JPEG 图像显示不正确。 2. 我制作了一个完全填充颜色值为 R=10,B=10 和 G=100 的小型 8*8 24 位(色深)BMP 文件...所有 64 个像素都是相同颜色的。 3. 我在每个步骤中得到的数据如下:
- BMP 头大小为 40 - 头大小为 40 - 宽度为 8 - 高度为 8 - 平面数为 1 - 每像素位数为 24 - 图像大小为 194 - x 分辨率每米像素数为 2834 - y 分辨率每米像素数为 2834 - 颜色数为 0 - 重要颜色数为 0 - (R,B,G)=(10,10,100) 的 Y Cb Cr 转换为 (62,-29,-37)
因此,让我们先考虑 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分量的单个数据单元的Zig Zag排序如下:

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

现在,上述Zig Zag序列的Huffman编码如下:

  • 亮度Y的DC编码:00111110
  • 亮度Y的AC编码:1010(对于亮度Y的AC Huffman表,EOB值为1010)
  • Cb和Cr分量的Huffman编码如下:
  • Cb的DC编码:11000010
  • Cb的AC编码:01(对于色度Cb、Cr的AC Huffman表,EOB值为01)
  • Cr的DC编码:110101110
  • Cr的AC编码:01
  • 我获得的最终Huffman编码是:

    001111101010110000100111010111001长度为33

因此,为了使其可被8整除,填充1。

0011111010101100001001110101110011111111 Length 40.

这里的每个0或1实际上是一个需要按原样存储在JPEG文件中的位,但由于我们无法逐位写入文件,因此需要取8位并将其转换为十进制整数值,然后存储到1字节字符中。

有人能提供关于我做错了什么的建议吗?


2
您似乎需要帮助撰写文章并选择适当的标签。 - Sinan Ünür
终于有一个很好的技术问题了。谢谢马克。不幸的是,我没有答案,但我希望有人知道。 - caskey
1
顺便提一下,将您的代码精简为其他人可以编译的最短示例可能会产生奇效。提供代码也是帮助他人看到可能遗漏的内容的更有效方法。 - Sinan Ünür
我投票反对这个问题,因为不清楚你认为哪部分结果是错误的,应该是什么样的,而且你也没有包含任何代码来说明可能发生了什么。 - aem
你有没有充分的理由不能使用IJG的libjpeg? - tialaramex
2个回答

2
解决问题的第一步是获取Pennebaker/Mitchel关于JPEG标准的书籍。
操作顺序如下:
1) 颜色空间转换 2) FDCT 3) 量化 4) Zigzag重排序 5) Huffman编码
由于需要遵循许多规则,这些操作具有许多复杂性。
a)您是否正确处理DC预测器? b)是否根据零的运行正确编码A/C分量? c)是否遵守有关“填充零”和标记的输出流规则? d)您的颜色空间转换公式是否正确?是否包括必须从每个组件中减去的0x80? e)基于所选的子采样选项,您是否按正确顺序对MCU块进行编码?

-2

不要重新发明轮子。使用ImageMagick、Magick++或CImg来完成这个任务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接