我正在编写一个 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 系数为:
以下是我尝试遵循的基本算法:
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字节字符中。
有人能提供关于我做错了什么的建议吗?