2012-05-15 28 views
31

Estoy usando PIL para cambiar el tamaño de las imágenes allí mediante la conversión de imágenes más grandes a las más pequeñas. ¿Hay alguna forma estándar de reducir el tamaño del archivo de la imagen sin perder demasiado la calidad, digamos que el tamaño original de la imagen es de 100 KB, quiero bajarlo a 5 o 10 KB, especialmente para los formatos png y jpeg.Cómo reducir el tamaño del archivo de imagen usando PIL

+0

¿Qué define como pérdida de calidad "excesiva"? Si desea reducir el tamaño del archivo en un factor de 10 a 20, la manera más fácil es reducir la cantidad de píxeles. Reducir el ancho y la altura en 2/3 le daría una imagen de aproximadamente 1/9 del tamaño del original. Pero esa es una gran cantidad de resolución que pierdes. –

Respuesta

1

Consulte la función thumbnail del Módulo de imagen de PIL. Puede usarlo para guardar versiones más pequeñas de archivos como varios tipos de archivos y si desea conservar la mayor calidad posible, considere usar el filtro ANTIALIAS cuando lo haga.

Aparte de eso, no estoy seguro de si hay una forma de especificar el tamaño máximo deseado. Por supuesto, podría escribir una función que podría intentar guardar varias versiones del archivo con diferentes calidades hasta que se cumpla un determinado tamaño, descartando el resto y dándole la imagen que deseaba.

+0

hay una manera de reducir el tamaño del archivo al mantener las dimensiones constantes esp. para formatos png. –

+1

Si desea mantener las mismas dimensiones, la única otra cosa que puede probar es establecer la configuración de calidad cuando guarde la imagen. Consulte [esta respuesta] (http://stackoverflow.com/a/1405701/369878) – Cryptite

+0

, pero el atributo de calidad no hace diferencia para los formatos png. Aunque cambie la calidad, el tamaño del archivo permanece igual. –

54

Un parámetro incorporado para guardar archivos JPEG y PNG es optimize.

# My image is a 200x374 jpeg that is 102kb large 
>>> foo = Image.open("path\\to\\image.jpg") 
>>> foo.size 
    (200,374) 
# I downsize the image with an ANTIALIAS filter (gives the highest quality) 
>>> foo = foo.resize((160,300),Image.ANTIALIAS) 
>>> foo.save("path\\to\\save\\image_scaled.jpg",quality=95) 
# The saved downsized image size is 24.8kb 
>>> foo.save("path\\to\\save\\image_scaled_opt.jpg",optimize=True,quality=95) 
# The saved downsized image size is 22.9kb 

La bandera optimize hará un pase extra en la imagen para encontrar una manera de reducir su tamaño tanto como sea posible. 1.9kb puede no parecer mucho, pero a lo largo de cientos/miles de imágenes, puede sumar.

Ahora, para tratar de bajarlo a 5 kb a 10 kb, puede cambiar el valor de calidad en las opciones de guardado. Usando una calidad de 85 en lugar de 95 en este caso sería Rendimiento: no optimizado: 15.1kb optimizada: 14.3kb Usando una calidad de 75 (por defecto si el argumento se deja fuera) produciría: no optimizado: 11.8kb optimizada: 11.2kb

Prefiero la calidad 85 con optimizar porque la calidad no se ve muy afectada, y el tamaño del archivo es mucho menor.

8

Digamos que tiene un modelo llamado libro y en él un campo llamado 'cover_pic', en ese caso, se puede hacer lo siguiente para comprimir la imagen:

from PIL import Image 
b = Book.objects.get(title='Into the wild') 
image = Image.open(b.cover_pic.path) 
image.save(b.image.path,quality=20,optimize=True) 

espero que ayude a cualquiera de tropiezo sobre eso

Cuestiones relacionadas