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)
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)
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.