【发布时间】:2017-03-29 11:51:54
【问题描述】:
我正在实现 JPEG 编码并将其写入 JFIF 容器中。
原图(位图):
我的编码 JPEG:
使用 Gimp 编码的 JPEG(质量 50 和基本设置):
我试图找出问题所在,我的猜测是它在编码数据本身中,而不是在 JFIF 标头中。
我在编码中完成的步骤(基本概述):
- RGB 转 YCbCr
- 在 MCU(8x8 块)中拆分每个 Y、Cb 和 Cr 信息。我没有对 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
- 处理 8x8 块 1 的 Cr
- 处理 Y 的 8x8 块 2
- 处理 Cb 的 8x8 块 2
- 处理 Cr 的 8x8 Block 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 编码输出更大并且显示不正确。欢迎任何帮助。
【问题讨论】:
-
这里有一些 [相对] 简单的 JPEG 源代码:colosseumbuilders.com/sourcecode/index.html 您需要做的是拍摄一些简单的图像并比较您的编码器在每个步骤中的工作方式。
-
谢谢。那个 JPEGDUMP 应用会很方便,但不再可用。
-
好的,它包含在库中。没看到:)
-
JPEG 文件格式具有垂直和水平采样因子 - 这些决定了扫描数据中组件 MCU 的顺序
标签: image encoding bitmap jpeg