我的目标是使用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文件无效或已损坏.有人可以指出
注意:创建块时遵循PNG规范
更新:此方法适用于并行创建IDAT
1. add one filter byte before …Run Code Online (Sandbox Code Playgroud)