Compresión de imágenes de Python

Ammar Ali 21 junio 2023
Compresión de imágenes de Python

Este tutorial discutirá cómo comprimir una imagen usando la biblioteca PIL en Python.

Antes de usar la biblioteca PIL, instálela usando pip o python.

pip install Pillow

Compresión de imágenes de Python usando la biblioteca PIL

La compresión de imágenes se utiliza para reducir el tamaño de una imagen. Sabemos que las imágenes consisten en píxeles que contienen valores de color o intensidad.

Existen principalmente dos formas de reducir el tamaño de una imagen o comprimir la imagen. Una forma es cambiar el tamaño de la imagen para reducir la cantidad de píxeles presentes.

Por ejemplo, si la imagen tiene 500 por 500 píxeles, podemos comprimirla o reducir su tamaño de archivo reduciendo la cantidad de píxeles de 500 por 500 a 100 por 100 píxeles. La imagen resultante se comprimirá, pero se volverá pequeña y el tamaño del archivo también disminuirá.

Cuanto más bajemos el número de píxeles, más disminuirá el tamaño del archivo, pero la imagen se hará más pequeña. Es posible que tengamos que hacer zoom en la imagen redimensionada para verla correctamente.

Podemos usar la función resize() del módulo Imagen de la biblioteca PIL para cambiar el tamaño de una imagen. La sintaxis básica de la función resize() se encuentra a continuación.

MyImage.resize(size, resample, box, reducing_gap)

En el código anterior, MyImage es el objeto del módulo Imagen que contiene la imagen de entrada. El parámetro tamaño contiene el tamaño de la imagen de salida, y debe ser una tupla de dos valores como (ancho, alto).

El parámetro remuestreo es opcional, y está configurado en Ninguno de forma predeterminada, y se usa para configurar el filtro de remuestreo, que se aplicará a la imagen para suavizarla como PIL.Image.Resampling.NEAREST filtro que suaviza cada píxel usando sus píxeles más cercanos.

El parámetro cuadro también es opcional con el valor predeterminado establecido en Ninguno y se usa para establecer la región de interés de la imagen, y debe ser una tupla de 4 valores que contenga la posición del cuadro como (0,0 ,ancho,alto).

El reduciendo_gap también es un argumento opcional, y se usa para aplicar optimización a la imagen, lo que reducirá aún más el tamaño de la imagen, y por defecto, su valor se establece en ninguno.

El valor de reducing_gap debe ser un número entero; un valor más pequeño significa un cambio de tamaño rápido y un valor grande significa un cambio de tamaño lento pero un mejor resultado.

Por ejemplo, comprimamos una imagen usando la función redimensionar(). Vea el código a continuación.

from PIL import Image

input_img = Image.open("test.jpg")
print("input image size:", input_img.size)

output_img = input_img.resize((300, 300))
print("output image size:", output_img.size)
output_img.save("testNew.jpg")

Producción :

input image size: (600, 600)
output image size: (300, 300)

imágenes redimensionadas

En el código anterior, usamos las funciones open() y guardar() del módulo Imagen de la biblioteca PIL para abrir y guardar las imágenes.

Solo hemos proporcionado el nombre y la extensión de la imagen en la función open() porque la imagen y el archivo de código de Python están en el mismo directorio, pero si no están en el mismo directorio, tenemos que proporcionar una completa ruta al archivo de imagen junto con su nombre y extensión para leerlo.

También hemos utilizado un nombre de imagen y una extensión en la función guardar(), que guardará la imagen en el directorio actual del archivo de código de Python, pero también podemos guardar la imagen en otro directorio proporcionando la ruta completa junto con el nombre de la imagen y la extensión.

En la imagen de arriba, la imagen del lado izquierdo es la imagen original; su tamaño es de 21,6 kb, la imagen del lado derecho es la imagen redimensionada y su tamaño es de 6,88 kb.

La imagen del lado derecho está ampliada al 200% para que podamos compararla fácilmente con la imagen original y ver una pequeña diferencia de calidad en ambas imágenes.

En el ejemplo anterior, no hemos usado argumentos opcionales, pero podemos usarlos para aumentar la calidad de la imagen de salida.

Otro método para comprimir una imagen es reducir la calidad de la imagen. En este método, la cantidad de píxeles de la imagen seguirá siendo la misma, pero la calidad de la imagen disminuirá junto con el tamaño del archivo de la imagen.

Podemos usar los argumentos optimizar y calidad dentro de la función guardar() para reducir el tamaño de archivo de una imagen.

El argumento optimizar se establecerá en true para aplicar la optimización a la imagen, lo que reducirá el tamaño sin perder mucha calidad, y el argumento calidad se puede configurar en cualquier porcentaje del 1 al 100.

Si configuramos la calidad al 50 por ciento, el tamaño del archivo de imagen se reducirá a la mitad. Por ejemplo, usemos la función guardar() solo para disminuir el tamaño del archivo en el ejemplo anterior.

Vea el código a continuación.

from PIL import Image

input_img = Image.open("test.jpg")
output_img = input_img.save("testNew.jpg", optimize=True, quality=50)
input_img_2 = Image.open("testNew.jpg")
print("Input image size:", input_img.size)
print("Output Image Size:", input_img_2.size)

Producción :

Input image size: (600, 600)
Output Image Size: (600, 600)

reducir la calidad de las imágenes

En la salida anterior, podemos ver que la cantidad de píxeles de las imágenes de entrada y salida es la misma, y la calidad de la imagen de salida disminuye. La imagen de la izquierda es la imagen original y la de la derecha es la imagen de salida.

Si comparamos ambos ejemplos, la calidad de ambas imágenes de salida es casi la misma, pero el tamaño de píxel de la imagen de salida en el primer ejemplo es menor que el tamaño de píxel de la imagen de salida en el segundo ejemplo. También podemos combinar las funciones resize() y save() para obtener el resultado requerido.

Autor: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

Artículo relacionado - Python Image