Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何完全从头开始实现PNG解码器_Algorithm_Image Processing_Png_Zlib_Deflate - Fatal编程技术网

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

Algorithm 如何完全从头开始实现PNG解码器,algorithm,image-processing,png,zlib,deflate,Algorithm,Image Processing,Png,Zlib,Deflate,为了便于学习,我开始研究PNG编码/解码库,所以我想手工实现它的每个部分 我花了很长时间,但现在我有点卡住了。以下是我已经成功实施的事项: 我可以加载一个PNG二进制文件并遍历它的字节 我可以读取签名和IHDR块中的元数据 我可以读取IDAT块并将图像数据连接到缓冲区中 我可以从上面提到的图像数据中读取和解释zlib头 这就是我被卡住的地方。我隐约知道从这里开始的步骤是: 根据zlib压缩数据的标题提取zlib压缩数据 找出使用的过滤方法并“撤消”它们以获取原始数据 如果一切正常,现在我有

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

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

  • 我可以加载一个PNG二进制文件并遍历它的字节
  • 我可以读取签名和IHDR块中的元数据
  • 我可以读取IDAT块并将图像数据连接到缓冲区中
  • 我可以从上面提到的图像数据中读取和解释zlib头
这就是我被卡住的地方。我隐约知道从这里开始的步骤是:

  • 根据zlib压缩数据的标题提取zlib压缩数据
  • 找出使用的过滤方法并“撤消”它们以获取原始数据
  • 如果一切正常,现在我有了原始RGB数据,格式为
    [,,等…]
我的问题是:
  • 是否有任何易于理解的实现(可能有示例)或zlib提取指南,因为我发现官方规范很难理解
  • 同一文件中是否可以使用多个筛选方法?如何解决这些问题?如何计算这些不同过滤部分的“边界”
  • 我对最终数据的理解正确吗?alpha通道或使用调色板时如何
  • 对。您可以查看,这是一个充气实现,其明确目的是指导如何解码放气流

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

  • 是的,如果你做得很好,那么你将有一个像素序列,其中每个像素是一个灰度值,G,带有一个alpha通道,GA,RGB(红-绿-蓝,按这个顺序),或者RGBA

  • 对。您可以查看,这是一个充气实现,其明确目的是指导如何解码放气流

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

  • 是的,如果你做得很好,那么你将有一个像素序列,其中每个像素是一个灰度值,G,带有一个alpha通道,GA,RGB(红-绿-蓝,按这个顺序),或者RGBA