使用PIL(1.1.7)创建的JPEG图像质量非常差.这是一个例子:
输入:https://s23.postimg.cc/8bks3x5p7/cover_1.jpg
输出:https://s23.postimg.cc/68ey9zva3/cover_2.jpg
使用以下代码创建输出图像:
from PIL import Image
im = Image.open('/path/to/cover_1.jpg')
im.save('/path/to/cover_2.jpg', format='JPEG', quality=100)
Run Code Online (Sandbox Code Playgroud)
红色文字看起来非常糟糕.使用GIMP或Photoshop保存图像甚至不能接近PIL创建的质量差.有人知道为什么会发生这种情况以及如何解决这个问题?
我目前正在尝试在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);
}
Run Code Online (Sandbox Code Playgroud)
然后,Libpng压缩一行接一行,并用压缩数据填充内部缓冲区.一旦缓冲区已满,压缩数据就会在IDAT块中刷新到映像文件.
我的方法是将图像分成多个部分,让一个线程压缩第1行到第10行,另一个线程压缩11到20,依此类推.但是由于libpng正在使用内部缓冲区,它并不像我想象的那么容易:)我不得不让libpng将压缩数据写入每个线程的单独缓冲区.之后我需要一种方法以正确的顺序连接缓冲区,这样我就可以将它们一起写入输出图像文件.
那么,是否有人知道我如何使用OpenMP和一些调整到libpng?非常感谢你!