【问题标题】:Need help understanding IDAT header in Png image file需要帮助理解 PNG 图像文件中的 IDAT 标头
【发布时间】:2022-01-24 12:14:23
【问题描述】:

我正在尝试使用十六进制编辑器从头开始制作一个简单的 png 图像文件。

高亮区域之前的字节用于 PNG 文件头和 IHDR。这表明我正在尝试制作一个

  1. 10 x 10 PNG 文件
  2. 灰度色彩空间
  3. 1 位深度(二级)
  4. 放气压缩?
  5. 自适应过滤?
  6. 无交错

突出显示的字节是 IDAT 字段未来长度的占位符。

问题:-现在我不确定应该将图像数据放在 IDAT 字段中的什么(或如何?)?

我知道图像的像素值是 MxN 维度的矩阵。显示有点像:

[ (255, 255, 255), (255, 255, 255) ... (255, 255, 255)] 
[ (255, 255, 255), (255, 255, 255) ... (255, 255, 255)] 
[ (255, 255, 255), (255, 255, 255) ... (255, 255, 255)]
[ (255, 255, 255), (255, 255, 255) ... (255, 255, 255)] 

白色 RGB 图像的像素值,其中左上的元组是(0, 0) 的像素的颜色值,右下是(m-1, n-1) 的颜色值。

现在我应该如何将其编码到 IDAT 标头的数据结构中? 我想知道的是如何将上面的值(像素值)转换为 deflate 块?

P.S.:- 我对 Deflate 的工作原理或 png 文件中使用的过滤算法不太了解。我已经阅读了 PNG 文件的 RFC 2083 和 Wikipedia 页面。我还阅读了有关堆栈交换的所有相关答案。

【问题讨论】:

  • RF 2083 定义了放气压缩,没有其他替代方法。您必须使用它,或者确定是否发布了允许更简单压缩(或没有)的修订。
  • @ChristophRackwitz 我不反对 Deflate 压缩。我要问的是压缩和过滤如何处理像素数据(像素值矩阵)
  • 如果这是您的问题,请在问题中提出。
  • Thisthis(从第一个链接)似乎很有希望成为一个很好的来源
  • 试试gzip -8 my_pixels.bin -c > my_pixels_compressed.bin是否可以压缩以上来源生成的字节流。在我阅读的源代码中,您可以使用zlib 来压缩gzip 使用的IDAT 流。不是解决方案,而是解决方案的潜在路径。

标签: image file image-processing png


【解决方案1】:

IDAT 内容是压缩流,即压缩数据。 Deflate 记录在 RFC 1951 中,这里的答案太复杂了。

被压缩的数据是过滤的像素行,其中每一行前面都有一个字节,用于标识用于该行的过滤器。

对于您的示例,每个像素是单个 ,因此十位占用两个字节(第二个字节的低六位未使用)。然后每行总共三个字节。这十行是 30 个字节。然后将这 30 个字节压缩为一个 deflate 流。

【讨论】:

    【解决方案2】:

    由于我还不能发表评论,所以我会发布答案。

    在这种情况下,您可能会为每种颜色使用 6 个字节的十六进制 (#RRGGBB)。 具有以下 RGB 值的像素列表:255 0 255, 0 0 255, 255 255 255 将变为:ff00ff 0000ff ffffff

    根据this question,所有字节都在 IDAT 中连接,因此您应该得到类似:ff00ff0000ffffffff

    但我不能 100% 确定这是否正确,事实上我有一个 similar question

    【讨论】:

    • 不,每个像素的 二进制 中有 三个 字节。没有十六进制。
    最近更新 更多