JPEG编码存储编码数据
JPEG encoding store encoded data
我正在实施 JPEG 编码并将其写入 JFIF 容器。
原图(位图):
我编码的 JPEG:
使用 The Gimp 编码的 JPEG(质量 50 和基本设置):
我正在尝试找出问题所在,我猜是编码数据本身而不是 JFIF header。
我在编码中完成的步骤(基本概述):
- RGB 转 YCbCr
- 拆分 MCU 中的每个 Y、Cb 和 Cr 信息(8x8 块)。我没有对 Cb 和 Cr 部分进行任何子采样,因为我还没有研究它到底是如何工作的。 (块 = MCU)
- 对 Y、Cb 和 Cr 的所有块应用 DCT
- 对 Y、Cb 和 Cr 的所有块进行量化
- 矢量化(1x64 数组)Y、Cb 和 Cr 的所有块 (Zig-Zag)
- 在 Y、Cb 和 Cr 的所有块上应用 DPCM (DC) 和 RLE (AC)。
- 施展霍夫曼魔法并保存数据。
对于最后一步 (7),我按如下方式处理 Y、Cb 和 Cr 块:
- 处理 Y 的 8x8 块 1
- 处理 Cb 的 8x8 块 1
- 处理 Cr 的 8x8 块 1
- 处理 Y 的 8x8 块 2
- 处理 Cb 的 8x8 块 2
- 处理 Cr 的 8x8 块 2
- 处理 Y 的 8x8 块 3
- ...
所以我的数据目前存储为 Y Cb Cr Y Cb Cr Y Cb Cr Y Cb ...
这是正确的吗?
或者Y、Cb、Cr的数据应该按如下方式处理:
Y Y Y Y ... Yn Cb Cb Cb .... Cbn Cr Cr Cr Cr .... Crn
我的问题(我猜是数据编码错误):
如何存储编码数据本身?
试图弄清楚为什么我的 JPEG 编码输出更大但显示不正确。欢迎任何帮助。
当我用 C 从头开始编写 JPEG 编码器时,我遇到了类似的问题。
所以我用bmptoppm把BMP转成JPG,用这张JPG图片作为参考。
打开参考图像和不正确的结果图像(将 .hex 附加到文件名,例如 reference.jpg.hex 和 myImage.jpg.hex ) 在你的文本编辑器中(我使用 Sublime Text)。
首先,确保两个 JPG 文件的 headers 相同。
然后导航到编码数据。
找出差异在哪里以及差异来自哪个 8 X 8 像素块。
现在查看块并找出哪个编码步骤不正确。
我的问题是霍夫曼 table 中的值有误。
所以当我第一次尝试对左边的 image 进行编码时,我得到了右边的那个。
我的编码器只针对gray-scale,所以我不确定Y,Cb和Cr的顺序。
希望您能按照以下步骤修复错误。
我正在实施 JPEG 编码并将其写入 JFIF 容器。
原图(位图):
我编码的 JPEG:
使用 The Gimp 编码的 JPEG(质量 50 和基本设置):
我正在尝试找出问题所在,我猜是编码数据本身而不是 JFIF header。
我在编码中完成的步骤(基本概述):
- RGB 转 YCbCr
- 拆分 MCU 中的每个 Y、Cb 和 Cr 信息(8x8 块)。我没有对 Cb 和 Cr 部分进行任何子采样,因为我还没有研究它到底是如何工作的。 (块 = MCU)
- 对 Y、Cb 和 Cr 的所有块应用 DCT
- 对 Y、Cb 和 Cr 的所有块进行量化
- 矢量化(1x64 数组)Y、Cb 和 Cr 的所有块 (Zig-Zag)
- 在 Y、Cb 和 Cr 的所有块上应用 DPCM (DC) 和 RLE (AC)。
- 施展霍夫曼魔法并保存数据。
对于最后一步 (7),我按如下方式处理 Y、Cb 和 Cr 块:
- 处理 Y 的 8x8 块 1
- 处理 Cb 的 8x8 块 1
- 处理 Cr 的 8x8 块 1
- 处理 Y 的 8x8 块 2
- 处理 Cb 的 8x8 块 2
- 处理 Cr 的 8x8 块 2
- 处理 Y 的 8x8 块 3
- ...
所以我的数据目前存储为 Y Cb Cr Y Cb Cr Y Cb Cr Y Cb ... 这是正确的吗?
或者Y、Cb、Cr的数据应该按如下方式处理:
Y Y Y Y ... Yn Cb Cb Cb .... Cbn Cr Cr Cr Cr .... Crn
我的问题(我猜是数据编码错误):
如何存储编码数据本身?
试图弄清楚为什么我的 JPEG 编码输出更大但显示不正确。欢迎任何帮助。
当我用 C 从头开始编写 JPEG 编码器时,我遇到了类似的问题。 所以我用bmptoppm把BMP转成JPG,用这张JPG图片作为参考。 打开参考图像和不正确的结果图像(将 .hex 附加到文件名,例如 reference.jpg.hex 和 myImage.jpg.hex ) 在你的文本编辑器中(我使用 Sublime Text)。 首先,确保两个 JPG 文件的 headers 相同。 然后导航到编码数据。 找出差异在哪里以及差异来自哪个 8 X 8 像素块。 现在查看块并找出哪个编码步骤不正确。
我的问题是霍夫曼 table 中的值有误。 所以当我第一次尝试对左边的 image 进行编码时,我得到了右边的那个。 我的编码器只针对gray-scale,所以我不确定Y,Cb和Cr的顺序。
希望您能按照以下步骤修复错误。