0

谁能告诉我如何在 C++ 中将 JPEG 图像划分为 8 x 8 块。

谢谢。

4

2 回答 2

2

啊,死硬的方法。我的心向你倾诉。期待学到很多东西,但要预先警告你这样做会浪费时间、流血和痛苦。

压缩常见问题解答有一些关于 JPEG 工作原理的详细信息。第 2 部分:主题 75:JPEG 简介是一个很好的起点。

简而言之,对于典型的 JPEG 文件,您必须将编码步骤 6 到 4 颠倒过来:

  1. (6)从JFIF容器中提取相应的headers和image数据
  2. (5)逆霍夫曼编码
  3. (4) 逆量化

然后,您应该留下 8x8 块,您可以将其输入适当的逆 DCT。

维基百科有一些关于JFIF格式的详细信息,以及 JFIF中 JPEG数据的霍夫曼表和结构。

我假设您正在寻找使用 JPEG 来了解它?因为如果您有一些实际应用程序,几乎可以肯定不需要访问原始编码块。

看到评论后编辑:如果您只想获得一个非常大的 JPEG 的一部分而不读取/解压缩整个文件,您可以使用 ImageMagick 的stream命令。它允许您在不读取整个文件的情况下获取子图像。像这样使用例如stream -extract 8x8+16+16 large.jpeg block.rgb从 (16,16) 开始获得一个 8x8 块。

于 2012-04-20T19:19:55.093 回答
1

您必须解压缩图像,使用 turbojpg 库(它非常快),它将为您提供一个unsigned charRGB(或 RGBA)数组。现在您有一个未压缩的图像,它分别具有 RG 和 B 的字节值。

您可以从这里开始制作一个简单的 for 循环,该循环将遍历 3*8char块并将它们复制memcpy到其他内存位置。

您必须记住,从 turbojpg 库返回的数组是一维线性字节数组。因此,扫描线一个接一个地存储。在创建块时要考虑到这一点,因为根据您的需要,您必须以不同的方式遍历数组。

于 2012-04-20T18:20:43.693 回答