在PIL中(以及大多数使用
libjpeg的软件/库),质量设置用于构建量化表(
ref.)。在libjpeg中,质量数字“缩放”样本表值(来自JPEG规范第K.1节)。在其他库中,不同的质量分配给不同的表(例如:Photoshop,数码相机)。
因此,换句话说,质量等于量化表,所以它比仅仅是一个数字更加复杂。
如果您想使用相同的“质量”保存修改后的图像,则只需使用相同的量化表即可。幸运的是,每个JPEG中都嵌入了量化表。不幸的是,在PIL中保存时无法指定量化表。带有libjpeg的命令行实用程序
cjpeg
可以完成这项工作。
下面是一些粗略的代码,用于保存具有指定量化表的JPEG:
from subprocess import Popen, PIPE
from PIL import Image, ImageFilter
proc = Popen('%s -sample 1x1 -optimize -progressive -qtables %s -outfile %s' % ('path/to/cjpeg', '/path/ta/qtable', 'out.jpg'), shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE)
P = '6'
if im.mode == 'L':
P = '5'
stdout, stderr = proc.communicate('P%s\n%s %s\n255\n%s' % (P, im.size[0], im.size[1], im.tostring()))
您需要找到从原始JPEG中提取量化表的方法。djpeg
可以做到这一点(libjpeg的一部分):
djpeg -verbose -verbose image.jpg > /dev/null
您还需要查找并设置采样。有关更多信息,请查看这里。您还可以查看test_subsampling
。
更新
我对PIL进行了修改,以添加在保存JPEG时指定子采样或量化表或两者的可能性。在保存时,您还可以指定quality='keep'
,图像将以与原始图像相同的量化表和子采样保存(必须是JPEG)。还有一些预设值(基于Photoshop),可以在保存时传递给质量参数。我的代码库。
更新2
我的代码现在已成为Pillow 2.0的一部分。因此,只需执行以下操作:
pip install Pillow