理解 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.
的详细信息
首先介绍一下上下文。我需要翻转 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.
的详细信息