En PIL (y en su mayoría todos los softwares que utilizan/Librairies libjpeg) el ajuste de calidad es el uso para construir la tabla de cuantificación (ref.). En libjpeg, el número de calidad "escala" los valores de la tabla de muestra (de la especificación JPEG Sección K.1). En otras bibliotecas, hay diferentes tablas que se asignan a diferentes calidades (por ej .: Photoshop, cámara digital).
Por lo tanto, en otros términos, la calidad es igual a la tabla de cuantificación, por lo que es más complejo que un número.
Si desea guardar sus imágenes de modificación con la misma "calidad", solo necesita utilizar la misma tabla de cuantificación. Afortunadamente, la tabla de cuantificación está incrustada en cada JPEG. Desafortunadamente, no es posible especificar una tabla de cuantificación cuando se guarda en PIL. cjpeg
, una línea de comando que viene con libjpeg, puede hacer eso.
Aquí hay algo de código bruto que guardar un archivo JPEG con una tabla de cuantificación se especifica:
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()))
Usted tendrá que encontrar la manera de extraer la tabla de cuantificación del JPEG original.djpeg
puede hacer eso (parte de libjpeg):
djpeg -verbose -verbose image.jpg > /dev/null
Tendrá también para encontrar y establecer el muestreo. Para obtener más información sobre ese cheque here. También puede mirar en test_subsampling
ACTUALIZACIÓN
hice un tenedor PIL añadir la posibilidad de especificar las tablas de submuestreo o cuantificación o ambos al guardar JPEG. También puede especificar quality='keep'
al guardar y la imagen se guardará con las mismas tablas de cuantización y submuestreo que el original (el original debe ser un JPEG). También hay algunos ajustes preestablecidos (basados en Photoshop) que puede pasar a calidad al guardar. My fork.
ACTUALIZACIÓN 2
Mi código es ahora parte de Pillow 2.0. Así que acaba de hacer:
pip install Pillow
información relevante: http://superuser.com/questions/62730/how-to-find-the-jpg-quality/91083#91083 – unutbu
En general no es posible recuperar la precisa valor de calidad utilizado para comprimir un archivo JPEG porque hay varias maneras diferentes de reducir la información almacenada y el valor de calidad es solo una guía para el codificador, pero, como señala @unutbu, algunos software pueden hacer una conjetura heroica. – andrewmu
Es probable que valga la pena mencionar que JPEG es un formato con pérdida, por lo que abrir y guardar una imagen degradará la calidad de la imagen, incluso si la opción "calidad" tiene el mismo valor. –