JPEG编码存储编码数据

JPEG encoding store encoded data

我正在实施 JPEG 编码并将其写入 JFIF 容器。

原图(位图):

我编码的 JPEG:

使用 The Gimp 编码的 JPEG(质量 50 和基本设置):

我正在尝试找出问题所在,我猜是编码数据本身而不是 JFIF header。

我在编码中完成的步骤(基本概述):

  1. RGB 转 YCbCr
  2. 拆分 MCU 中的每个 Y、Cb 和 Cr 信息(8x8 块)。我没有对 Cb 和 Cr 部分进行任何子采样,因为我还没有研究它到底是如何工作的。 (块 = MCU)
  3. 对 Y、Cb 和 Cr 的所有块应用 DCT
  4. 对 Y、Cb 和 Cr 的所有块进行量化
  5. 矢量化(1x64 数组)Y、Cb 和 Cr 的所有块 (Zig-Zag)
  6. 在 Y、Cb 和 Cr 的所有块上应用 DPCM (DC) 和 RLE (AC)。
  7. 施展霍夫曼魔法并保存数据。

对于最后一步 (7),我按如下方式处理 Y、Cb 和 Cr 块:

  1. 处理 Y 的 8x8 块 1
  2. 处理 Cb 的 8x8 块 1
  3. 处理 Cr 的 8x8 块 1
  4. 处理 Y 的 8x8 块 2
  5. 处理 Cb 的 8x8 块 2
  6. 处理 Cr 的 8x8 块 2
  7. 处理 Y 的 8x8 块 3
  8. ...

所以我的数据目前存储为 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.hexmyImage.jpg.hex ) 在你的文本编辑器中(我使用 Sublime Text)。 首先,确保两个 JPG 文件的 headers 相同。 然后导航到编码数据。 找出差异在哪里以及差异来自哪个 8 X 8 像素块。 现在查看块并找出哪个编码步骤不正确。

我的问题是霍夫曼 table 中的值有误。 所以当我第一次尝试对左边的 image 进行编码时,我得到了右边的那个。 我的编码器只针对gray-scale,所以我不确定Y,Cb和Cr的顺序。

希望您能按照以下步骤修复错误。