在PIL(大多数所有使用
libjpeg的软件/图书馆)中,质量设置用于构建量化表(
ref.).在libjpeg中,质量数字“比例”示例表值(从JPEG规范第K.1节).在其他图书馆,不同的表格分配给不同的品质(例如:Photoshop,数码相机).
所以,在其他方面,质量等于量化表,所以它更复杂,只是一个数字.
如果要保存具有相同“质量”的修改图像,则只需使用相同的量化表.幸运的是,量化表被嵌入到每个JPEG中.不幸的是,保存在PIL中时不可能指定量化表. cjpeg,libjpeg附带的命令行实用程序可以这样做.
这里有一些粗略的代码,用一个指定的量化表来保存一个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
您还需要找到并设置采样.有关here的更多信息.您还可以查看test_subsampling
UPDATE
我做了一个PIL分支,以增加在保存JPEG时指定子采样或量化表或两者的可能性.您还可以在保存时指定quality =’keep’,并使用相同的量化表和子采样(原始需要JPEG)保存图像.还有一些预设(基于Photoshop),您可以在保存时传递到质量. My fork.
更新2
我的代码现在是Pillow 2.0的一部分.所以只要做:
pip install Pillow