1. Automatización del procesamiento por lotes de imágenes
El procesamiento por lotes de imágenes te permite realizar las mismas acciones en un montón de archivos, ahorrando tiempo y esfuerzo. Por ejemplo, si tienes un directorio con imágenes que necesitan cambiar de tamaño o agregar una marca de agua, Pillow te permite crear un solo script que aplicará las operaciones a todas las imágenes.
Cambiar el tamaño de todas las imágenes en una carpeta
En este ejemplo cambiaremos el tamaño de todas las imágenes en la carpeta input_images
y guardaremos los resultados en la carpeta output_images
.
import os
from PIL import Image
input_folder = "input_images/"
output_folder = "output_images/"
new_size = (800, 800)
# Asegúrate de que la carpeta para guardar las imágenes exista
os.makedirs(output_folder, exist_ok=True)
# Recorremos cada archivo en la carpeta input_folder
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# Abrimos la imagen y cambiamos su tamaño
with Image.open(image_path) as img:
resized_img = img.resize(new_size)
output_path = os.path.join(output_folder, filename)
# Guardamos la imagen
resized_img.save(output_path)
print(f"Imagen {filename} redimensionada y guardada exitosamente.")
Este script:
- Carga todos los archivos de la carpeta
input_images
. - Cambia el tamaño de cada imagen a 800x800 píxeles.
- Guarda las imágenes redimensionadas en la carpeta
output_images
.
Agregar una marca de agua a las imágenes
Agregar una marca de agua a todas las imágenes en una carpeta es muy fácil de automatizar. En este ejemplo se añade una marca de agua con texto en la esquina inferior derecha de cada imagen.
from PIL import ImageDraw, ImageFont
input_folder = "input_images/"
output_folder = "watermarked_images/"
watermark_text = "© Mi Empresa"
# Asegúrate de que la carpeta para guardar las imágenes exista
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
# Abrimos la imagen y creamos un objeto para dibujar
with Image.open(image_path) as img:
draw = ImageDraw.Draw(img)
width, height = img.size
font = ImageFont.truetype("arial.ttf", 24)
# Posición para la marca de agua
text_width, text_height = draw.textsize(watermark_text, font=font)
x = width - text_width - 10
y = height - text_height - 10
# Añadimos la marca de agua
draw.text((x, y), watermark_text, font=font, fill=(255, 255, 255, 128))
output_path = os.path.join(output_folder, filename)
img.save(output_path)
print(f"Marca de agua añadida a la imagen {filename}.")
Este script:
- Carga todas las imágenes de
input_images
. - Agrega una marca de agua con texto en la esquina inferior derecha de la imagen.
- Guarda el resultado en
watermarked_images
.
Convertir imágenes al formato PNG
Convertir todas las imágenes a un solo formato también es muy sencillo de automatizar. En este ejemplo, convertiremos todas las imágenes de la carpeta al formato PNG.
input_folder = "input_images/"
output_folder = "png_images/"
# Asegúrate de que la carpeta para guardar las imágenes exista
os.makedirs(output_folder, exist_ok=True)
for filename in os.listdir(input_folder):
if filename.endswith((".jpg", ".jpeg", ".bmp", ".tiff")):
image_path = os.path.join(input_folder, filename)
# Abrimos y convertimos la imagen a PNG
with Image.open(image_path) as img:
base_filename = os.path.splitext(filename)[0]
output_path = os.path.join(output_folder, f"{base_filename}.png")
img.save(output_path, "PNG")
print(f"Imagen {filename} convertida exitosamente a PNG.")
Este script convierte imágenes de formatos JPEG, BMP y TIFF a PNG y las guarda en la carpeta png_images
.
2. Trabajando con animaciones GIF
Las animaciones GIF son una secuencia de imágenes que se muestran una tras otra, creando un efecto de movimiento. Con Pillow puedes crear y editar animaciones GIF, agregar y modificar cuadros, así como controlar la velocidad de la animación.
Crear una animación GIF sencilla
Para crear una animación GIF, necesitas preparar varias imágenes (cuadros) que se mostrarán en secuencia. En este ejemplo creamos un GIF a partir de imágenes en la carpeta frames
.
# Lista de imágenes para la animación
frames_folder = "frames/"
frames = []
for filename in sorted(os.listdir(frames_folder)):
if filename.endswith((".png", ".jpg")):
frame_path = os.path.join(frames_folder, filename)
frame = Image.open(frame_path)
frames.append(frame)
# Guardar los cuadros en una animación GIF
frames[0].save("animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
Este código:
- Carga imágenes de la carpeta
frames
y las añade a la listaframes
. - Crea una animación GIF con estos cuadros.
- El parámetro
duration=100
especifica cuánto tiempo se muestra cada cuadro en milisegundos, yloop=0
establece un bucle infinito de reproducción.
Cambiar la velocidad de la animación GIF
Para cambiar la velocidad de la animación, simplemente ajusta el valor del parámetro duration
.
# Crear una animación con mayor velocidad
frames[0].save("fast_animation.gif", save_all=True, append_images=frames[1:], duration=50, loop=0)
En este ejemplo duration=50
, lo que acelera la reproducción del GIF al doble.
Agregar nuevos cuadros a un GIF existente
También puedes abrir un GIF existente, agregarle nuevos cuadros y guardar la animación actualizada.
# Abrir un GIF existente
with Image.open("existing_animation.gif") as gif:
frames = [frame.copy() for frame in ImageSequence.Iterator(gif)]
# Agregar un nuevo cuadro
new_frame = Image.open("new_frame.png")
frames.append(new_frame)
# Guardar la animación actualizada
frames[0].save("updated_animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)
Este código agrega un nuevo cuadro new_frame.png
al final de la animación.
Extraer cuadros de una animación GIF
A veces es necesario dividir una animación GIF en cuadros individuales. Pillow permite extraer y guardar cada cuadro por separado.
from PIL import ImageSequence
# Abrir la animación GIF y extraer los cuadros
with Image.open("animation.gif") as gif:
for i, frame in enumerate(ImageSequence.Iterator(gif)):
frame.save(f"frame_{i}.png")
Este código guarda cada cuadro de la animación como una imagen PNG individual.
Un ejemplo completo de trabajo con animaciones GIF y procesamiento por lotes
Para finalizar, aquí tienes un ejemplo que combina la automatización del procesamiento por lotes y el trabajo con GIF. Creamos una animación a partir de todas las imágenes en una carpeta, cambiando el tamaño de cada cuadro antes de añadirlo.
# Cargar imágenes, cambiarles el tamaño y crear un GIF
input_folder = "input_images/"
frames = []
new_size = (400, 400)
for filename in sorted(os.listdir(input_folder)):
if filename.endswith((".jpg", ".jpeg", ".png")):
image_path = os.path.join(input_folder, filename)
with Image.open(image_path) as img:
resized_frame = img.resize(new_size)
frames.append(resized_frame)
GO TO FULL VERSION