2009-09-10 22 views
45

Estoy trabajando en PIL y necesito saber si la calidad de la imagen se puede ajustar al redimensionar o miniaturizar una imagen. Por lo que he sabido, la calidad predeterminada está establecida en 85. ¿Se puede modificar este parámetro durante el cambio de tamaño?¿Cómo ajustar la calidad de una imagen redimensionada en la Biblioteca de imágenes de Python?

actualmente estoy usando el siguiente código:

image = Image.open(filename) 
image.thumbnail((x, y), img.ANTIALIAS) 

El parámetro ANTIALIAS presumiblemente da la mejor calidad. Necesito saber si podemos obtener más granularidad en la opción de calidad.

Respuesta

70

de Uso PIL resize método manual:

image = image.resize((x, y), Image.ANTIALIAS) # LANCZOS as of Pillow 2.7 

Seguido por el método save

quality_val = 90 
image.save(filename, 'JPEG', quality=quality_val) 

Tome un vistazo a la fuente de models.py de Photologue para ver cómo lo hacen.

+1

Gracias, eso es exactamente lo que estaba buscando ... Solo una adición: La opción de calidad es un kwarg, por lo que debe pasar como calidad = calidad – bigmac

+0

@bigmac - gracias, editado! –

+1

También tenga en cuenta que si su imagen original está 'indexada', en la mayoría de los casos aumentará la calidad de la salida si la convierte a' RGB' o 'RGBA' antes de llamar a' .resize() '. –

44

ANTIALIAS no es de ninguna manera comparable al nivel de calidad "85". El parámetro ANTIALIAS le dice al método de miniatura qué algoritmo usar para volver a muestrear los píxeles de un tamaño a otro. Por ejemplo, si tengo una imagen de 3x3 que tiene este aspecto:

2 2 2 
2 0 2 
2 2 2 

y cambiar su tamaño para 2x2, un algoritmo podría darme:

2 2 
2 2 

porque la mayoría de los píxeles en las inmediaciones son 2s, mientras que otro podría darme:

1 1 
1 1 

con el fin de tener en cuenta el 0 en el medio. Pero todavía no ha empezado a lidiar con la compresión, y no lo hará hasta que guarde la imagen. Lo que quiere decir que al hacer miniaturas, no se trata de gradaciones de calidad, sino de algoritmos discretos para el remuestreo. Entonces no, no puedes tener un control más fino aquí.

Si guarda en un formato con compresión con pérdida, ese es el lugar para especificar los niveles de calidad.

+4

+1, excelente manera de explicarlo –

+1

Esa es una buena explicación. Saludos ... – bigmac

+0

Gracias a todos. Me alegro de que haya sido útil – jcdyer

8

No confunda el reajuste y la compresión.

Para obtener la mejor calidad, tiene que usar ambos. Vea el siguiente código:

from PIL import Image 

image = Image.open(filename) 
image.thumbnail((x, y), Image.ANTIALIAS) 
image.save(filename, quality=100) 

De esta manera tengo muy buenos pulgares en mis programas.

+16

"La calidad de imagen, en una escala de 1 (peor) a 95 (mejor). El valor predeterminado es 75. Se deben evitar los valores superiores a 95; 100 desactiva completamente la etapa de cuantificación JPEG." http://www.pythonware.com/library/pil/handbook/format-jpeg.htm –

0

Una forma de lograr una mejor calidad es realizar la reducción en dos pasos. Por ejemplo, si la imagen original es 1200x1200 y lo que necesita para cambiar su tamaño a 64x64 píxeles, a continuación, en el primer escalón descendente de la escala a algún lugar en medio de estos dos tamaños:

1200x1200 -> 600x600 -> 64x64

+4

Esto solo es válido si utiliza un filtro de reducción de escala pobre. – mattdm

Cuestiones relacionadas