CodeGym /Cursos /Python SELF ES /GIF y Automatización del procesamiento de imágenes

GIF y Automatización del procesamiento de imágenes

Python SELF ES
Nivel 46 , Lección 4
Disponible

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:

  1. Carga todos los archivos de la carpeta input_images.
  2. Cambia el tamaño de cada imagen a 800x800 píxeles.
  3. 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:

  1. Carga todas las imágenes de input_images.
  2. Agrega una marca de agua con texto en la esquina inferior derecha de la imagen.
  3. 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:

  1. Carga imágenes de la carpeta frames y las añade a la lista frames.
  2. Crea una animación GIF con estos cuadros.
  3. El parámetro duration=100 especifica cuánto tiempo se muestra cada cuadro en milisegundos, y loop=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)
1
Cuestionario/control
Operaciones complejas con imágenes, nivel 46, lección 4
No disponible
Operaciones complejas con imágenes
Operaciones complejas con imágenes
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION