In PIL (und meistens in allen Software/Libraries, die libjpeg verwenden) wird die Qualitätseinstellung verwendet, um die Quantisierungstabelle zu erstellen (ref.). In libjpeg skaliert die Qualitätszahl die Werte der Beispieltabelle (aus der JPEG-Spezifikation Abschnitt K.1). In anderen Libraries gibt es verschiedene Tabellen, die verschiedenen Qualitäten zugeordnet sind (zB Photoshop, Digitalkamera).
Also, in anderen Worten, die Qualität entspricht der Quantisierungstabelle, also ist es komplexer als nur eine Zahl.
Wenn Sie Ihre geänderten Bilder mit der gleichen "Qualität" speichern möchten, müssen Sie nur die gleiche Quantisierungstabelle verwenden. Glücklicherweise ist die Quantisierungstabelle in jedem JPEG eingebettet. Leider ist es beim Speichern in PIL nicht möglich, eine Quantisierungstabelle anzugeben. cjpeg
, eine Befehlszeile Dienstprogramme, die mit libjpeg kommen, können das tun.
Hier einige grobe Code, der ein jpeg mit einer bestimmten Quantisierungstabelle speichern:
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()))
Sie müssen den Weg finden, die Quantisierungstabelle aus dem ursprünglichen jpeg zu extrahieren.djpeg
kann tun, dass (Teil libjpeg):
djpeg -verbose -verbose image.jpg > /dev/null
Sie auch die Probenahme zu finden und stellen Sie benötigen. Weitere Informationen hierzu finden Sie unter here. Sie können an test_subsampling
UPDATE schauen auch
ich eine PIL Gabel hat die Möglichkeit, hinzuzufügen Subsampling oder Quantisierungstabellen oder beide angeben, wenn JPEG speichern. Sie können auch quality='keep'
beim Speichern angeben, und das Bild wird mit denselben Quantisierungstabellen und Subsampling wie das Original gespeichert (Original muss ein JPEG sein). Es gibt auch einige Voreinstellungen (basierend auf Photoshop), die Sie beim Speichern an die Qualität übergeben können. My fork.
UPDATE 2
ist mein Code jetzt Teil von Pillow 2.0. So tun gerade:
pip install Pillow
Relevante Informationen: http://superuser.com/questions/62730/how-to-find-the-jpg-quality/91083#91083 – unutbu
Im Allgemeinen ist es nicht möglich, die präzise zu erholen Qualitätswert, der verwendet wird, um eine JPEG-Datei zu komprimieren, da es verschiedene Möglichkeiten gibt, die gespeicherten Informationen zu reduzieren. Der Qualitätswert ist nur eine Richtlinie für den Encoder, aber, wie @unutbu hervorhebt, kann einige Software heldenhaft raten. – andrewmu
Es ist wahrscheinlich erwähnenswert, dass JPEG ein verlustbehaftetes Format ist, so dass das Öffnen und Speichern eines Bildes die Bildqualität verschlechtert, auch wenn die Option "Qualität" auf denselben Wert eingestellt ist. –