小编Pra*_*jan的帖子

使用libpng快速编码位图缓冲区到png

我的目标是使用C/C++将32位位图(BGRA)缓冲区实时转换为png图像.为了实现它,我使用libpng库转换位图缓冲区,然后写入png文件.然而,在单线程中执行目标臂板(四核处理器)似乎需要花费大量时间(~5秒).在分析时,我发现libpng压缩过程(deflate算法)占用了90%以上的时间.所以我试图通过某种方式使用并行化来减少它.这里的最终目标是至少在不到0.5秒的时间内完成.

现在因为png可以有多个IDAT块,我想到并行编写多个IDAT的png.使用以下方法编写具有多个IDAT的自定义png文件

   1. Write PNG IHDR chunk
   2. Write IDAT chunks in parallel
      i.   Split input buffer in 4 parts.
      ii.  compress each part in parallel using zlib "compress" function.
      iii. compute CRC of chunk { "IDAT"+zlib compressed data }.
      iv.  create IDAT chunk i.e. { "IDAT"+zlib compressed data+ CRC}.
      v.   Write length of IDAT chunk created.
      vi.  Write complete chunk in sequence.
   3. write IEND chunk
Run Code Online (Sandbox Code Playgroud)

现在问题是此方法创建的png文件无效或已损坏.有人可以指出

  1. 我究竟做错了什么?
  2. 有没有快速实现zlib压缩或多线程png创建,最好是在C/C++中?
  3. 任何其他实现目标的替代方式?

注意:创建块时遵循PNG规范

更新:此方法适用于并行创建IDAT

    1. add one filter byte before …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm multithreading zlib libpng

6
推荐指数
1
解决办法
1963
查看次数

标签 统计

algorithm ×1

c++ ×1

libpng ×1

multithreading ×1

zlib ×1