我正在实现JPEG编码并将其写入JFIF容器。
原始图像(位图):
我的编码JPEG:
使用Gimp编码的JPEG(质量50和基本设置):
我正在试图弄清楚问题,我的猜测是它在编码数据本身而不是在JFIF标题中。
我在编码中完成的步骤(基本概述):
对于最后一步(7),我按如下方式处理Y,Cb和Cr块:
所以我的数据目前存储为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编码输出更大并且无法正确显示。欢迎任何帮助。
答案 0 :(得分:1)
当我在C中从头开始编写JPEG编码器时,我遇到了类似的问题。 所以我使用bmptoppm将BMP转换为JPG并使用此JPG图像作为参考。 在文本编辑器中打开参考图像和不正确的结果(将.hex附加到文件名,例如 reference.jpg.hex 和 myImage.jpg.hex )(我使用Sublime Text)。 首先,确保两个JPG文件的标题相同。 然后导航到编码数据。 找出差异的来源以及差异来自哪个8×8像素块。 现在查看块并找出哪个编码步骤不正确。
我的问题是霍夫曼表中有一个错误的值。 所以当我第一次尝试编码左边的image时,我得到了右边的那个。 我的编码器仅用于灰度,因此我不确定Y,Cb和Cr的序列。
希望您可以按照以下步骤修复错误。