我正在讨论W3 PNG规范(从头开始创建PNG库),我终于找到了如何创建绿色1x1图像。
现在我正在尝试创建一个混合的红色,绿色和蓝色像素的更大图像。让我们说4x4图像。可悲的是,我将所有像素混合在一起,其中一些是黑色或粉红色。
详细说明:
* IDATA块:
**按位结果:
alpha<<24 | red<<16 | green<<8 | blue
使用alpha,blue,green和red取0到255之间的值
这有什么问题?
答案 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块中的块。