4

从下面的示例图像中,我有一个黄色边框,仅用于显示目的。

实际的 .png 文件是 3 像素 x 3 像素的简单黑白图像。我最初想尝试作为 2x2,但这无助于尝试解释低/高与高/低绘图流。至少这样,我会从顶部有两个黑色,一个白色,或者从底部开始一个白色,两个黑色..

所以我读取了数据块,得到了 IDAT 块,解码(zlib)并得出 12 个字节,如下所示

00 20 00 40 00 80

所以,我的问题是,上面的内容如何分解为 3x3 黑白样本...此外,它以调色板格式保存,并正确识别 1 的位深度和 2 的调色板...调色板 [0 ] 是 RGBA 全零。调色板1的 RGBA 为 255、255、255、0

稍后我将最终进入多种其他深度格式,只是想从最简单的开始。

第二部分。如果需要考虑任何特别的问题,尤其是关于 Alpha 通道(我已经在调色板中寻找)可能会绊倒我的任何处理其他深度格式的指导。

在此处输入图像描述

4

1 回答 1

5

如果您使用libpng会更容易,所以我想这是出于学习目的。

问题是,如果您直接解压缩 IDAT 块,您会得到一些不应该显示和/或可能需要转换(因为应用了过滤器)以获得实际字节的数据。在 PNG 格式中,每一行都以一个额外的字节开始,告诉您哪个过滤器应用于该行,其余字节包含行像素。

顺便说一句,00 20 00 40 00 80只有 6 个字节(不是你想的 12 个字节)。现在,如果您将此数据视为二进制数据,您的 3 行将如下所示:

00000000 00100000
00000000 01000000
00000000 10000000

现在,您的图像每像素 1 位,因此需要 1 个字节来保存一行 3 个像素。实际使用了 3 个最高位(忽略 5 个低位)。我用 a 替换了忽略的位x,所以我认为更容易看到实际像素0黑色,1白色):

00000000 001xxxxx
00000000 010xxxxx
00000000 100xxxxx

在这种情况下,没有对任何行应用过滤器,因为每行的第一个字节为零(0表示未应用过滤器,从1to的值表​​示应用4了过滤器)。

于 2013-11-10T17:25:17.260 回答