如何从头开始完全实现PNG解码器

时间:2018-10-15 14:49:49

标签: algorithm image-processing png zlib deflate

出于学习目的,我开始研究PNG编码/解码库,因此我想手工实现它的每个部分。

我已经用了很长时间,但是现在有点卡住了。这是我已经成功实现的事情:

  • 我可以加载PNG二进制文件并检查其字节
  • 我可以读取元数据的签名和IHDR块
  • 我可以读取IDAT块并将图像数据连接到缓冲区中
  • 我可以从上述图像数据中读取和解释zlib标头

这是我卡住的地方。我隐约知道从这里开始的步骤是:

  • 根据其标头提取zlib压缩数据
  • 找出所使用的过滤方法并“撤消”以获取原始数据
  • 如果一切正常,现在我可以使用[<R of 1st pixel>, <G of 1st pixel>, <B of 1st pixel>, <R of 2nd pixel>, <G of 2nd pixel>, etc...]
  • 形式的原始RGB数据了

我的问题是:

  • 我发现官方规范难以理解时,是否有任何易于理解的实现(可能带有示例)或有关zlib提取的指南
  • 同一文件中可以使用多种过滤方法吗?如何弄清楚这些?如何找出这些经过不同过滤的部分的“边界”?
  • 我是否了解最终数据的正确性?阿尔法通道或使用调色板时会怎样?

1 个答案:

答案 0 :(得分:1)

  1. 是的。您可以查看puff.c,它是一个膨胀的实现,其明确目的是指导如何解码deflate流。

  2. 图像的每一行都可以使用不同的过滤器,该过滤器在解压缩后的行的第一个字节中指定。

  3. 是的,如果一切正常,那么您将有一个像素序列,其中每个像素都是灰度值G,带有alpha通道GA,RGB(红绿蓝,顺序)或RGBA。