在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
相關信息:http://superuser.com/questions/62730/how-to-find-the-jpg-quality/91083#91083 – unutbu 2010-12-04 16:54:30
一般來說,是不可能恢復的精確用於壓縮JPEG文件的質量值,因爲存在各種不同的減少存儲信息的方式,而質量值僅僅是編碼器的指南,但正如@unutbu指出的那樣,某些軟件可以做出英雄式的猜測。 – andrewmu 2010-12-04 17:00:19
可能值得一提的是,JPEG是一種有損格式,因此即使「質量」選項設置爲相同值,打開和保存圖像也會降低圖像質量。 – 2011-01-12 12:20:14