【问题标题】:How do I write encoded information (JPEG/JFIF) when it is not a multiple of eight?当编码信息不是八的倍数时,如何编写编码信息 (JPEG/JFIF)?
【发布时间】:2013-05-29 04:06:03
【问题描述】:

我正在尝试编写一个基线 JPEG 编码器。我已经知道如何处理JFIF format(非常好的文章,顺便说一句)。现在我正在尝试压缩一个基本上是白色的 8x8 灰度图像。因此,考虑到一个白色像素基本上是 255,once you apply the JPEG algorithm(省略 zig zag 步骤,因为对于这个例子来说它基本上是不必要的)你得到这个矩阵:

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 位填充以达到字节边界,你会没事的。

标签: compression jpeg


【解决方案1】:

JPEG format 说:

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

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

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

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

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

【讨论】:

  • 谢谢。我不敢相信我错过了。编码器现在工作得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-02
  • 2013-05-12
  • 2020-09-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多