当编码信息不是8的倍数时,如何编写编码信息(JPEG / JFIF)?

时间:2013-06-03 02:45:22

标签: compression jpeg

我正在尝试编写基线JPEG编码器。我已经知道如何处理JFIF format(非常好的文章,BTW)。现在我正在尝试压缩基本上是白色的8x8灰度图像。因此,考虑到白色像素基本上是255,once you apply the JPEG algorithm(避免了之字形步骤,因为这个例子基本上没有必要)你得到这个矩阵:

B = [63 0 0 0 0 0 0 0
     0  0 0 0 0 0 0 0
     0  0 0 0 0 0 0 0
     0  0 0 0 0 0 0 0
     0  0 0 0 0 0 0 0
     0  0 0 0 0 0 0 0
     0  0 0 0 0 0 0 0
     0  0 0 0 0 0 0 0]

我们可以看到,只有一个直流分量(63),没有交流分量。 If you check the Huffman tables您发现类别为6( 1110 ),并且因为二进制中的63是111111,此DC分量的位序列是1110111111(10位)。现在,根据算法,当所有AC分量都为0时,你需要发送EOB,其序列是1010(四位)。所以,最后,最后的位序列是 11101111111010 (14位)。

现在,我们已经知道我只能将(或附加)字节写入文件。所以我想把这样的东西写成一个新的.jpeg文件:

0xFF 0xD8 .. JFIF metadata ... 11101111111010 0xFF 0xD9
SOI marker                     block          EOI marker

问题是,我应该怎么做这14位?我想我需要插入2个填充位(我不知道它们是否有更好的术语)来获得2个字节,但我不知道在哪里插入它们,更不用说它们的值(00?01?10?11 ?)。我想这是数据编码和/或低级编程中的常见问题,因此我得到了广泛的解决:)

1 个答案:

答案 0 :(得分:1)

JPEG format说:

  

发生的唯一填充是在扫描结束时,如果字节不完整,则最后一个字节中的剩余位用1填充。

所以你应该在这里填写1 - s。这意味着你应该有:

1110       111111            1010         11
DC code    DC value (=63)    EOB (=10)    Extra 1-s

换句话说,11101111 11101011以十六进制给出0xEF 0xEB序列。

专业提示:您可以参考code section中的jpec - 一个用C编写的微型JPEG编码器。此外,jpec_huff_write_bits包含相关文档,可帮助您了解如何在霍夫曼时间写这些位。