JPEG编码存储编码数据

时间:2017-03-29 11:51:54

标签: image encoding bitmap jpeg

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

原始图像(位图):

original bitmap (bmp)

我的编码JPEG:

enter image description here

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

enter image description here

我正在试图弄清楚问题,我的猜测是它在编码数据本身而不是在JFIF标题中。

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

  1. RGB到YCbCr
  2. 拆分MCU中的每个Y,Cb和Cr信息(8x8块)。我没有对Cb和Cr部件进行任何子采样,因为我还没有研究过它是如何工作的。 (blocks = MCU's)
  3. 将DCT应用于所有Y,Cb和Cr
  4. 所有Y,Cb和Cr块的量化
  5. 向量化(1x64阵列)所有Y,Cb和Cr块(Zig-Zag)
  6. 在所有Y,Cb和Cr块上应用DPCM(DC)和RLE(AC)。
  7. 做霍夫曼魔法并保存数据。
  8. 对于最后一步(7),我按如下方式处理Y,Cb和Cr块:

    1. 处理8x8 Y的第1块
    2. 处理8x8 Cb块1
    3. 处理8x8 Cr 1的块
    4. 处理8x8 Y的第2块
    5. 处理8x8 Cb块2
    6. 处理8x8 Cr的块2
    7. 处理8x8 Y的第3块
    8. ...
    9. 所以我的数据目前存储为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编码输出更大并且无法正确显示。欢迎任何帮助。

1 个答案:

答案 0 :(得分:1)

当我在C中从头开始编写JPEG编码器时,我遇到了类似的问题。 所以我使用bmptoppm将BMP转换为JPG并使用此JPG图像作为参考。 在文本编辑器中打开参考图像和不正确的结果(将.hex附加到文件名,例如 reference.jpg.hex myImage.jpg.hex )(我使用Sublime Text)。 首先,确保两个JPG文件的标题相同。 然后导航到编码数据。 找出差异的来源以及差异来自哪个8×8像素块。 现在查看块并找出哪个编码步骤不正确。

我的问题是霍夫曼表中有一个错误的值。 所以当我第一次尝试编码左边的image时,我得到了右边的那个。 我的编码器仅用于灰度,因此我不确定Y,Cb和Cr的序列。

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