【问题标题】:How to implement a PNG decoder completely from scratch如何从头开始完全实现 PNG 解码器
【发布时间】:2019-03-20 00:55:17
【问题描述】:

出于学习目的,我开始研究 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 提取指南,因为我发现官方规范难以理解
  • 可以在同一个文件中使用多种过滤方法吗?如何弄清楚这些?如何找出这些不同过滤部分的“边界”?
  • 我对最终数据的理解是否正确? Alpha 通道或何时使用调色板?

【问题讨论】:

标签: algorithm image-processing png zlib deflate


【解决方案1】:
  1. 是的。您可以查看puff.c,这是一个充气实现,其明确目的是作为如何解码放气流的指南。

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

  3. 1234563按此顺序),或 RGBA。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2020-01-05
    • 2014-12-31
    • 1970-01-01
    相关资源
    最近更新 更多