我正在尝试编写基线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 ?)。我想这是数据编码和/或低级编程中的常见问题,因此我得到了广泛的解决:)
答案 0 :(得分:1)
发生的唯一填充是在扫描结束时,如果字节不完整,则最后一个字节中的剩余位用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
包含相关文档,可帮助您了解如何在霍夫曼时间写这些位。