【问题标题】:JPEG encoding store encoded dataJPEG编码存储编码数据
【发布时间】:2017-03-29 11:51:54
【问题描述】:

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

原图(位图):

我的编码 JPEG:

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

我试图找出问题所在,我的猜测是它在编码数据本身中,而不是在 JFIF 标头中。

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

  1. RGB 转 YCbCr
  2. 在 MCU(8x8 块)中拆分每个 Y、Cb 和 Cr 信息。我没有对 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. 处理 8x8 块 1 的 Cr
  4. 处理 Y 的 8x8 块 2
  5. 处理 Cb 的 8x8 块 2
  6. 处理 Cr 的 8x8 Block 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 编码输出更大并且显示不正确。欢迎任何帮助。

【问题讨论】:

  • 这里有一些 [相对] 简单的 JPEG 源代码:colosseumbuilders.com/sourcecode/index.html 您需要做的是拍摄一些简单的图像并比较您的编码器在每个步骤中的工作方式。
  • 谢谢。那个 JPEGDUMP 应用会很方便,但不再可用。
  • 好的,它包含在库中。没看到:)
  • JPEG 文件格式具有垂直和水平采样因子 - 这些决定了扫描数据中组件 MCU 的顺序

标签: image encoding bitmap jpeg


【解决方案1】:

当我用 C 从头开始​​编写 JPEG 编码器时,我遇到了类似的问题。 所以我使用bmptoppm 将BMP 转换为JPG 并以此JPG 图像作为参考。 在您的文本编辑器(我使用崇高文本)。 首先,确保两个 JPG 文件的标题相同。 然后导航到编码数据。 找出差异在哪里以及差异来自哪个 8 X 8 像素块。 现在查看块,找出哪个编码步骤不正确。

我的问题是霍夫曼表中有错误的值。 所以当我第一次尝试编码左边的image 时,我得到了右边的那个。 我的编码器是只做灰度的,所以不清楚Y、Cb、Cr的顺序。

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

【讨论】:

    猜你喜欢
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多