2014-03-26 40 views
1

我正在通过W3 PNG规范(从零开始创建一个PNG库),并且我终于找到了如何创建一个绿色的1x1图像。PNG IDAT规范

现在我试图创建混合​​红色,绿色和蓝色像素的更大图像。假设一张4x4图片。可悲的是我得到的所有像素混合,其中一些是黑色或粉红色。

详细说明:

  • 签名:行
  • IHDR:OK
    • 宽度:4
    • 嗨:4
    • 位深度:8
    • 颜色:2
    • 筛选:0
    • 压缩:0
    • 隔行:0
  • IDATA:4块*
  • IEND:OK

* IDATA块:

  • 4个字节长度:字节数Zlib泄气后的DATA数据
  • 4 * 1字节类型:IDAT
  • X字节数据:4 * 4字节的无符号整数,zlib的放气时,一个接一个地,网络字节顺序
    • 255用于蓝色**
    • 65280绿色**
    • 16711680后用于红色**
  • 4个字节的CRC:OK

**按位的结果:

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

使用alpha,蓝色,绿色和红色取值从0到255

这是什么问题?

+0

这个问题被交叉发布到DSP,所以我复制了我的答案。 –

回答

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,压缩一点。它可以全部进入一个IDAT块。如果您需要编写较小的IDAT块,则必须先对zlib-compress图像进行压缩,然后将zlib输出拆分为连续放入IDAT块的块。

+0

很好的解释。我会马上尝试。关于行...我猜他们会根据图像宽度渲染,是吗?所以我只需要将这些13bytes组一个接一个地写出 – robertodecurnex

+0

是的,只需将您的行字节连接成一个长流并将其发送到zlib即可。 –

+0

工作完美! – robertodecurnex