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:
- Carrega todos os arquivos na pasta
input_images
. - Redimensiona cada imagem para 800x800 pixels.
- 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:
- Carrega todas as imagens da pasta
input_images
. - Adiciona uma marca d'água de texto no canto inferior direito da imagem.
- 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:
- Carrega imagens da pasta
frames
e adiciona-as à listaframes
. - Cria uma animação GIF a partir desses frames.
- O parâmetro
duration=100
define a duração de exibição de cada frame em milissegundos, eloop=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)
GO TO FULL VERSION