PNG IDAT规范

时间:2014-03-26 20:16:52

标签: image image-processing png encode

我正在讨论W3 PNG规范(从头开始创建PNG库),我终于找到了如何创建绿色1x1图像。

现在我正在尝试创建一个混合的红色,绿色和蓝色像素的更大图像。让我们说4x4图像。可悲的是,我将所有像素混合在一起,其中一些是黑色或粉红色。

详细说明:

  • 签名:好的
  • IHDR:好的
    • 宽度:4
    • 高:4
    • 比特深度:8
    • 颜色:2
    • 过滤:0
    • 压缩:0
    • 交错:0
  • IDATA:4个块*
  • IEND:好的

* IDATA块:

  • 4个字节长度:Zlib放气后的DATA字节数
  • 4 * 1字节类型:IDAT
  • X字节数据:4 * 4字节无符号整数,Zlib放气,一个接一个,网络字节顺序
    • 255 for blue **
    • 65280 for green **
    • 16711680 for red **
  • 4字节crc:好的

**按位结果:

alpha<<24 | red<<16 | green<<8 | blue

使用alpha,blue,green和red取0到255之间的值

这有什么问题?

1 个答案:

答案 0 :(得分:2)

PNG像素是RGBA顺序,而不是ARGB,因此您需要编写

alpha | red<<24 | green << 16 | blue <<8

但是您正在编写颜色类型2,因此您的像素应为每个3个字节 而不是四个;你无法用4字节整数对它们进行真正的编码 就像你做的那样。因此要么将颜色类型更改为6或切换 将每个样本写为单个字节。

此外,您需要在每行的开头添加一个过滤字节。零将起作用 为了你。因此,在您的示例4x4 RGB图像中,您需要每个写入13个字节 行

0 R G B R G B R G B R G B
0 R G B R G B R G B R G B
0 R G B R G B R G B R G B
0 R G B R G B R G B R G B

然后将所有行字节连接成一个字节流并将其连接到zlib-compress。它可以全部进入一个IDAT块。如果您需要编写较小的IDAT块,则必须首先对图像进行zlib压缩,然后将zlib输出拆分为连续IDAT块中的块。