我目前正在尝试在 C++ 中实现基于 libpng 的 PNG 编码器,该编码器使用 OpenMP 来加速压缩过程。该工具已经能够从各种图像格式生成 PNG 文件。我将完整的源代码上传到了 pastebin.com,所以你可以看到我到目前为止所做的:http: //pastebin.com/8wiFzcgV
到目前为止,一切都很好!现在,我的问题是找到一种方法来并行生成包含压缩图像数据的 IDAT 块。通常,libpng 函数 png_write_row 在 for 循环中被调用,其中包含指向包含有关 PNG 文件的所有信息的结构的指针和包含单个图像行的像素数据的行指针。
(Pastebin 文件中的第 114-117 行)
//Loop through image
for (i = 0, rp = info_ptr->row_pointers; i < png_ptr->height; i++, rp++) {
png_write_row(png_ptr, *rp);
}
Libpng 然后逐行压缩并用压缩数据填充内部缓冲区。一旦缓冲区已满,压缩数据就会以 IDAT 块的形式刷新到图像文件中。
我的方法是将图像分成多个部分,让一个线程将第 1 行压缩到第 10 行,另一个线程将第 11 行压缩到第 20 行,依此类推。但是由于 libpng 使用的是内部缓冲区,它并不像我最初想的那么容易 :) 我必须让 libpng 将压缩数据写入每个线程的单独缓冲区。之后我需要一种方法以正确的顺序连接缓冲区,以便我可以将它们一起写入输出图像文件。
那么,有人知道我如何使用 OpenMP 来做到这一点,并对 libpng 进行一些调整吗?非常感谢!