小编Pas*_*cal的帖子

为什么PIL生成的JPEG图像质量如此差?

使用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创建的质量差.有人知道为什么会发生这种情况以及如何解决这个问题?

python python-imaging-library

20
推荐指数
1
解决办法
1万
查看次数

使用C++,libpng和OpenMP并行化PNG文件创建

我目前正在尝试在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?非常感谢你!

c++ parallel-processing png openmp libpng

9
推荐指数
2
解决办法
3314
查看次数