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

Bal*_*ros 1 algorithm png zlib image-processing deflate

为了学习目的,我开始研究 PNG 编码/解码库,所以我想手动实现它的每个部分。

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

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

这就是我陷入困境的地方。我隐约知道这里的步骤是:

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

我的问题是:

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

Mar*_*ler 5

  1. 是的。您可以查看puff.c,它是一个 inflate 实现,其编写的明确目的是作为如何解码 deflate 流的指南。

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

  3. 是的,如果你没问题,那么你将得到一个像素序列,其中每个像素都是一个灰度值 G,带有 alpha 通道、GA、RGB(按红-绿-蓝顺序),或者RGBA。