CodeGym /Curso Java /Python SELF PT /GIF e Automação de Processamento de Imagens

GIF e Automação de Processamento de Imagens

Python SELF PT
Nível 46 , Lição 4
Disponível

1. Automação do processamento em lote de imagens

O processamento em lote de imagens permite realizar as mesmas ações em um grande número de arquivos, economizando tempo e esforço. Por exemplo, se você tem uma pasta de imagens que precisam ser redimensionadas ou receber uma marca d'água, o Pillow permite criar um único script que realizará as operações em todas as imagens.

Redimensionando todas as imagens de uma pasta

Neste exemplo, vamos redimensionar todas as imagens na pasta input_images e salvar os resultados na pasta output_images.


import os
from PIL import Image

input_folder = "input_images/"
output_folder = "output_images/"
new_size = (800, 800)

# Garantindo que a pasta para salvar imagens exista
os.makedirs(output_folder, exist_ok=True)

# Percorrendo cada arquivo na pasta input_folder
for filename in os.listdir(input_folder):
    if filename.endswith((".jpg", ".jpeg", ".png")):
        image_path = os.path.join(input_folder, filename)
        
        # Abrindo a imagem e redimensionando
        with Image.open(image_path) as img:
            resized_img = img.resize(new_size)
            output_path = os.path.join(output_folder, filename)
            
            # Salvando a imagem
            resized_img.save(output_path)
            print(f"Imagem {filename} redimensionada e salva com sucesso.")

Este script:

  1. Carrega todos os arquivos na pasta input_images.
  2. Redimensiona cada imagem para 800x800 pixels.
  3. Salva as imagens redimensionadas na pasta output_images.

Adicionando marca d'água às imagens

Adicionar uma marca d'água em todas as imagens de uma pasta pode ser facilmente automatizado. Neste exemplo, adicionamos uma marca d'água de texto no canto inferior direito de cada imagem.


from PIL import ImageDraw, ImageFont

input_folder = "input_images/"
output_folder = "watermarked_images/"
watermark_text = "© My Company"

# Garantindo que a pasta para salvar imagens 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)
        
        # Abrindo a imagem e criando um objeto para desenhar
        with Image.open(image_path) as img:
            draw = ImageDraw.Draw(img)
            width, height = img.size
            font = ImageFont.truetype("arial.ttf", 24)
            
            # Posição para a marca d'água
            text_width, text_height = draw.textsize(watermark_text, font=font)
            x = width - text_width - 10
            y = height - text_height - 10
            
            # Adiciona marca d'água
            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 d'água adicionada à imagem {filename}.")

Este script:

  1. Carrega todas as imagens da pasta input_images.
  2. Adiciona uma marca d'água de texto no canto inferior direito da imagem.
  3. Salva o resultado em watermarked_images.

Convertendo imagens para formato PNG

A conversão de todas as imagens para um único formato também pode ser facilmente automatizada. Neste exemplo, convertemos todas as imagens de uma pasta para o formato PNG.


input_folder = "input_images/"
output_folder = "png_images/"

# Garantindo que a pasta para salvar imagens 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)
        
        # Abrindo e convertendo a imagem para 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"Imagem {filename} convertida para PNG com sucesso.")

Este script converte imagens dos formatos JPEG, BMP e TIFF para PNG, salvando-as na pasta png_images.

2. Trabalhando com animações GIF

As animações GIF são uma sequência de imagens que são exibidas uma após a outra, criando um efeito de movimento. Com o Pillow, é possível criar e editar animações GIF, adicionar e alterar frames e controlar a velocidade da animação.

Criando uma animação GIF simples

Para criar uma animação GIF, você precisa preparar algumas imagens (frames) que serão exibidas sequencialmente. Neste exemplo, criamos um GIF a partir de imagens na pasta frames.


# Lista de imagens para animação
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)

# Salvando os frames em uma animação GIF
frames[0].save("animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)

Este script:

  1. Carrega imagens da pasta frames e adiciona-as à lista frames.
  2. Cria uma animação GIF a partir desses frames.
  3. O parâmetro duration=100 define a duração de exibição de cada frame em milissegundos, e loop=0 define um loop infinito de reprodução.

Alterando a velocidade de uma animação GIF

Para alterar a velocidade da animação, basta mudar o valor do parâmetro duration.


# Criando animação com velocidade aumentada
frames[0].save("fast_animation.gif", save_all=True, append_images=frames[1:], duration=50, loop=0)

Neste exemplo, duration=50, o que acelera a reprodução do GIF em duas vezes.

Adicionando novos frames a um GIF existente

Você também pode abrir um GIF existente, adicionar novos frames e salvar a animação atualizada.


# Abrindo um GIF existente
with Image.open("existing_animation.gif") as gif:
    frames = [frame.copy() for frame in ImageSequence.Iterator(gif)]

# Adicionando um novo frame
new_frame = Image.open("new_frame.png")
frames.append(new_frame)

# Salvando a animação atualizada
frames[0].save("updated_animation.gif", save_all=True, append_images=frames[1:], duration=100, loop=0)

Esse código adiciona o novo frame new_frame.png ao final da animação.

Extraindo frames de uma animação GIF

Às vezes, é necessário dividir uma animação GIF em frames separados. O Pillow permite extrair e salvar cada frame individualmente.


from PIL import ImageSequence

# Abrindo a animação GIF e extraindo frames
with Image.open("animation.gif") as gif:
    for i, frame in enumerate(ImageSequence.Iterator(gif)):
        frame.save(f"frame_{i}.png")

Este script salva cada frame da animação como uma imagem PNG separada.

Exemplo completo de trabalho com animações GIF e processamento em lote

Por fim, aqui está um exemplo que combina automação de processamento em lote e trabalho com GIF. Criamos uma animação a partir de todas as imagens da pasta, redimensionando cada frame antes de adicioná-lo.


# Carregando imagens, redimensionando e criando 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
Опрос
Operações avançadas com imagens,  46 уровень,  4 лекция
недоступен
Operações avançadas com imagens
Operações avançadas com imagens
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION