理解 IDAT 块以翻转图像

Undersanding IDAT chunk to flip the image

首先介绍一下上下文。我需要翻转 PNG 图像。我得到每个字节的信息(按顺序),我必须将它作为流翻转。我设法划分和解析这些块。但是当我有 IDAT 块数据时,我不知道如何使用它来翻转它。

来自 IHDR 的信息:位深度 = 08(每个样本 8 位)和颜色类型 = 06。 图像为 800 x 600 = 480000

IDAT 大小为 179502,因此占像素总大小的 0.374(奇怪)。

如果我翻转像素(所有 IDAT 数据原样),我得到一个图像,当我打开它时只显示透明图像。我也尝试使用 4 字节 = 1 像素,因为我有 RGB + alpha,但仍然没有好的结果。 (总是透明图像...这也很奇怪...我希望是随机图像,而不是透明图像)。

我看到信息被压缩了,所以我的计划是解压,翻转RGB数组然后再次压缩,但是...我怎样才能解压和再压缩?我找不到 info/algorithm 来执行此操作。

我还发现 0x78 十六进制几乎总是在 IDAT 部分之后,所以我推断压缩像素阵列不是直接在 IDAT 之后开始,而是在一些字节之后...如果是这样...它是如何组织的?它只是像素数组目录还是在 IDAT 块数据之后 and/or 之前有一些信息?

IDAT 块包括图像的像素数据,经过预过滤和压缩。要获得 RGB,您需要:

  • 连接所有 IDAT 块
  • 解压缩流 (ZLIB)
  • 取消过滤应用于每一行的 filter
  • 根据图像的pixel format,您可能在每个字节中都有 RGB 分量,或者可能是单词,或者可能是某些位(也许它们不是 RGB 分量,而是索引到调色板中, 或灰度, 或 Alpha...)

简而言之,您需要解码 PNG 图片,这并不简单。那里有很多 PNG 解码器,所以我不知道你为什么要重新发明轮子。如果你真的想自己做,那么你需要阅读 PNG standard.

的详细信息