Cómo reducir el tamaño del archivo de imagen usando PIL -- python campo con image campo con compression campo con python-imaging-library camp Relacionados El problema

How to reduce the image file size using PIL


87
vote

problema

Español

Estoy usando Pil para cambiar el tamaño de las imágenes allí al convertir imágenes más grandes a las más pequeñas. ¿Hay alguna forma estándar para 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 100kb, quiero bajarlo a 5 o 10 kb especialmente para formatos PNG y JPEG.

Original en ingles

I am using PIL to resize the images there by converting larger images to smaller ones. Are there any standard ways to reduce the file size of the image without losing the quality too much, lets say the original size of the image is 100KB, i want to get it down to like 5 or 10 KB especially for png and jpeg formats.

           
 
 

Lista de respuestas

144
 
vote

Un parámetro incorporado para guardar jpegs y pngs es optimize .

   >>> from PIL import Image  # 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   

El indicador optimize2 hará un paso adicional en la imagen para encontrar una manera de reducir su tamaño tanto como sea posible. 1.9KB puede que no parezca mucho, pero sobre cientos / miles de imágenes, puede sumar.

Ahora para intentarlo a 5kb a 10 kb, puede cambiar el valor de calidad en las opciones de guardar. El uso de una calidad de 85 en lugar de 95 en este caso cedería: Unoptimizado: 15.1KB Optimizado: 14.3kb Usando una calidad de 75 (predeterminado si el argumento está excluido) cedería: Unoptimizado: 11.8kb Optimizado: 11.2kb

Prefiero la calidad 85 con optimización porque la calidad no se ve afectada mucho, y el tamaño del archivo es mucho más pequeño.

 

A built-in parameter for saving JPEGs and PNGs is optimize.

 >>> from PIL import Image  # 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 

The optimize flag will do an extra pass on the image to find a way to reduce its size as much as possible. 1.9kb might not seem like much, but over hundreds/thousands of pictures, it can add up.

Now to try and get it down to 5kb to 10 kb, you can change the quality value in the save options. Using a quality of 85 instead of 95 in this case would yield: Unoptimized: 15.1kb Optimized : 14.3kb Using a quality of 75 (default if argument is left out) would yield: Unoptimized: 11.8kb Optimized : 11.2kb

I prefer quality 85 with optimize because the quality isn't affected much, and the file size is much smaller.

 
 
 
 
23
 
vote

Digamos que tiene un modelo llamado Libro y en él un campo llamado 'Cover_PIC', En ese caso, 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 le ayude a cualquiera que se tropezó con él.

 

lets say you have a model called Book and on it a field called 'cover_pic', in that case, you can do the following to compress the image:

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) 

hope it helps to anyone stumbling upon it.

 
 
5
 
vote

El administrador principal de la imagen en PIL es 9988777665 's Image6 Módulo.

  from PIL import Image import math  foo = Image.open("path\to\image.jpg") x, y = foo.size x2, y2 = math.floor(x-50), math.floor(y-20) foo = foo.resize((x2,y2),Image.ANTIALIAS) foo.save("path\to\save\image_scaled.jpg",quality=95)   

Puede agregar optimize=True a los argumentos de usted desean disminuir aún más el tamaño, pero optimice solo funciona para JPEG y PNG. Para otras extensiones de imagen, podría disminuir la calidad de la nueva imagen guardada. Puede cambiar el tamaño de la nueva imagen simplemente eliminando un poco de código y definiendo el tamaño de la imagen y solo puede descubrir cómo hacerlo si observa el código con cuidado. Definimos este tamaño:

  x, y = foo.size x2, y2 = math.floor(x-50), math.floor(y-20)   

Solo para mostrarle lo que está (casi) normalmente hecho con imágenes horizontales. Para imágenes verticales que pueda hacer:

   >>> from PIL import Image  # 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 0  

. Recuerde, aún puede eliminar ese bit de código y definir un nuevo tamaño.

 

The main image manager in PIL is PIL's Image module.

from PIL import Image import math  foo = Image.open("path\\to\\image.jpg") x, y = foo.size x2, y2 = math.floor(x-50), math.floor(y-20) foo = foo.resize((x2,y2),Image.ANTIALIAS) foo.save("path\\to\\save\\image_scaled.jpg",quality=95) 

You can add optimize=True to the arguments of you want to decrease the size even more, but optimize only works for JPEG's and PNG's. For other image extensions, you could decrease the quality of the new saved image. You could change the size of the new image by just deleting a bit of code and defining the image size and you can only figure out how to do this if you look at the code carefully. I defined this size:

x, y = foo.size x2, y2 = math.floor(x-50), math.floor(y-20) 

just to show you what is (almost) normally done with horizontal images. For vertical images you might do:

x, y = foo.size x2, y2 = math.floor(x-20), math.floor(y-50) 

. Remember, you can still delete that bit of code and define a new size.

 
 
4
 
vote

Consulte la miniatura Función 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 preservar la mayor calidad posible, considere usar el filtro Image11111 cuando lo haga.

Aparte de eso, no estoy seguro de si hay una manera de especificar un tamaño máximo deseado. Puede, por supuesto, escribir una función que pueda intentar guardar múltiples versiones del archivo en las cualidades variables hasta que se cumpla un tamaño determinado, descartando el resto y le da la imagen que desea.

 

See the thumbnail function of PIL's Image Module. You can use it to save smaller versions of files as various filetypes and if you're wanting to preserve as much quality as you can, consider using the ANTIALIAS filter when you do.

Other than that, I'm not sure if there's a way to specify a maximum desired size. You could, of course, write a function that might try saving multiple versions of the file at varying qualities until a certain size is met, discarding the rest and giving you the image you wanted.

 
 
         
         
-3
 
vote

Si tiene un PNG graso (1 MB para 400x400, etc.):

   >>> from PIL import Image  # 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 2  
 

If you hava a fat png (1MB for 400x400 etc.):

__import__("importlib").import_module("PIL.Image").open("out.png").save("out.png") 
 
 

Relacionados problema

3  Obtenga un error de imagen no válido en Django, pero PIL está instalado y pasa todas las pruebas  ( Getting invalid image error in django but pil is installed and passes all tests ) 
Así que finalmente he instalado con éxito PIL (después de muchas dificultades) en RHEL5 con Django (versión de desarrollo) y Python 2.6 instalado en /Opt/Pyth...

0  Cambiar los campos de retorno en el método de lectura Django-Piston  ( Change return fields in read method django piston ) 
Estoy usando Django-Piston para crear mi API. Necesito saber si es posible cambiar los campos de retorno de acuerdo con un parámetro. Estoy intentando devolve...

0  Conciliar las coordenadas de píxeles en la imagen PIL lienzo tkinter y (Phyton)  ( Reconciling pixel coordinates on tkinter canvas and pil image python ) 
Tengo un formulario (en formato .png) con cuadros de texto en blanco (por lo general rellenados a mano). Me gustaría rellenar las cajas con texto. Para hace...

1  ¿Es posible controlar qué bibliotecas utiliza Apache?  ( Is it possible to control which libraries apache uses ) 
De acuerdo, así que tuve una Problema anterior con PIL que aún no está resuelto. Alguien más tuvo este problema y tuvo éxito por Extracción de la antigua b...

4  Pil vs rmagick / ruby-gd  ( Pil vs rmagick ruby gd ) 
Para mi próximo proyecto, planeo crear imágenes con texto y gráficos. Me siento cómodo con Ruby, pero está interesado en aprender Python. Pensé que esto puede...

56  Pil Thumbnail está girando mi imagen?  ( Pil thumbnail is rotating my image ) 
Estoy intentando tomar imágenes grandes (enormes) (desde una cámara digital), y convertirlas en algo que pueda mostrar en la web. Esto parece sencillo, y prob...

3  Creando Simply Image Gallery en Python, Tkinter & Pil  ( Creating simply image gallery in python tkinter pil ) 
Entonces, estoy en un proyecto simple para un curso en línea para hacer una galería de imágenes usando Python. La cosa es crear 3 botones uno siguiente, anter...

2  Problemas para usar Pil con Google AppEngine SDK  ( Trouble using pil with google appengine sdk ) 
Tengo una máquina de Windows Server 2008 R2 (64bits) en la que quería desarrollar una aplicación de Google Appengine. Así que instalé Python 2.5.4 de Python...

21  Especifique el color de llenado de la imagen al girar en Python con PIL y configuración Expandir argument a True  ( Specify image filling color when rotating in python with pil and setting expand ) 
Estoy tratando de rotar una imagen en Python usando Pil y con el argumento AMPLISE a VERDADERO. Parece que cuando el fondo de mi imagen es negro, la imagen re...

8  Split Multi-PAGE TIFF con Python  ( Split multi page tiff with python ) 
¿Cuál es la mejor manera de dividir un tiff de múltiples páginas con Python? PIL no parece tener apoyo para imágenes de varias páginas, y no he encontrado un ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos