Manipulando Imagens com a Biblioteca Pillow - Python
Introdução
A Pillow é uma das bibliotecas mais populares para manipulação de imagens em Python. Ela é derivada da PIL (Python Imaging Library), que era compatível apenas com o Python 2 e está descontinuada. A Pillow, por sua vez, é totalmente compatível com o Python 3 e continua em constante desenvolvimento, oferecendo recursos robustos para o trabalho com imagens.
A instalação da biblioteca pode ser realizada com o comando:
pip install Pillow
Em algumas distribuições Linux, a Pillow já pode estar incluída por padrão.
Importando o Módulo
Antes de utilizar a biblioteca, o módulo Image
from PIL import Image
Abrindo uma Imagem
Neste artigo, utilizaremos a imagem "forest.jpg"
Se escolher trabalhar com a imagem fornecida, lembre-se de colocá-la na mesma pasta onde seu script Python está localizado. A imagem representa uma paisagem de floresta, ideal para experimentar as funcionalidades da biblioteca Pillow.

Para abrir uma imagem, utiliza-se o método open()
Image
from PIL import Image
img = Image.open("forest.jpg")
Neste caso, a variável img
Image
Caso o caminho do arquivo seja inválido ou haja algum problema ao abrir a imagem, é recomendável utilizar um bloco try/except
from PIL import Image
try:
img = Image.open("C://somefolder//forest.jpg")
except Exception as e:
print(f"Erro ao abrir a imagem: {e}")
Obtendo Informações sobre a Imagem
A classe Image
: nome ou caminho do arquivo.filename
: formato do arquivo, como JPEG ou PNG. Retorna None para imagens criadas pela biblioteca.format
: modo da imagem, como "1", "L", "RGB" ou "CMYK". A lista completa de modos pode ser encontrada na documentação oficial.mode
: dimensões da imagem como uma tupla (largura, altura).size
ewidth
: largura e altura da imagem.height
: dicionário com metadados adicionais.info
: indica se a imagem possui mais de um quadro.is_animated
: número de quadros na imagem.n_frames
Exemplo para exibir informações:
from PIL import Image
img = Image.open("forest.jpg")
print(f"Largura: {img.width}")
print(f"Altura: {img.height}")
print(f"Nome do arquivo: {img.filename}")
print(f"Formato: {img.format}")
print(f"Modo: {img.mode}")
Exibindo a Imagem na Tela
Para abrir a imagem no visualizador padrão do sistema operacional, é utilizado o método show()
from PIL import Image
img = Image.open("forest.jpg")
img.show()
Salvando Imagens
O método save()
from PIL import Image
img = Image.open("forest.jpg")
img.save("forest_new.jpg")
Rotacionando Imagens
O método rotate()
from PIL import Image
img = Image.open("forest.jpg")
img_rotated = img.rotate(90)
img_rotated.save("forest_rotated.jpg")
Imagem de floresta rotacionada em 90 graus:

Recortando Imagens
O método crop()
(x_inicial, y_inicial, x_final, y_final)
from PIL import Image
img = Image.open("forest.jpg")
img_cropped = img.crop((0, 0, img.width // 2, img.height // 2))
img_cropped.save("forest_cropped.jpg")
Redimensionando Imagens
Para alterar as dimensões da imagem, é utilizado o método resize()
from PIL import Image
img = Image.open("forest.jpg")
img_resized = img.resize((img.width // 2, img.height // 2))
img_resized.save("forest_resized.jpg")
Para reduzir a imagem proporcionalmente, utiliza-se o método reduce()
from PIL import Image
img = Image.open("forest.jpg")
img_reduced = img.reduce(2)
img_reduced.save("forest_reduced.jpg")
Sobreposição de Imagens
A biblioteca Pillow permite sobrepor imagens utilizando o método paste()
No exemplo abaixo, utilizaremos duas imagens: "forest.jpg"
"wolf.png"
from PIL import Image
# Carrega a imagem de fundo e a imagem a ser sobreposta
img = Image.open("forest.jpg")
img_overlay = Image.open("wolf.png")
# Calcula a posição para sobrepor o lobo na parte inferior central
position = (img.width // 2 - img_overlay.width // 2, img.height - img_overlay.height - 20)
# Aplica a sobreposição com uma máscara para respeitar a transparência
img.paste(img_overlay, position, img_overlay)
img.save("wolf_in_forest.jpg")

Neste caso:
A variável
define as coordenadas da sobreposição. Aqui, o lobo é posicionado horizontalmente no centro da floresta e próximo à parte inferior, deixando um pequeno espaçamento de 20 pixels.position
O terceiro parâmetro do método
é opcional, mas quando utilizado, permite aplicar uma máscara. Se a imagem sobreposta contiver transparência (como o canal alfa no formato PNG), ela será respeitada.paste()
Espelhamento de Imagens
O método transpose()
: espelha horizontalmente.Image.Transpose.FLIP_LEFT_RIGHT
: espelha verticalmente.Image.Transpose.FLIP_TOP_BOTTOM
: rotaciona 90 graus.Image.Transpose.ROTATE_90
: rotaciona 180 graus.Image.Transpose.ROTATE_180
: rotaciona 270 graus.Image.Transpose.ROTATE_270
: transpõe a imagemImage.Transpose.TRANSPOSE
: transpõe e rotaciona 90 graus.Image.Transpose.TRANSVERSE
Exemplo de espelhamento horizontal:
from PIL import Image
img = Image.open("forest.jpg")
img_flipped = img.transpose(Image.Transpose.FLIP_LEFT_RIGHT)
img_flipped.save("forest_flipped.jpg")
Aplicando Filtros
Para aplicar filtros à imagem, é utilizado o método o método filter()
ImageFilter
BLUR
CONTOUR
DETAIL
EDGE_ENHANCE
EDGE_ENHANCE_MORE
EMBOSS
FIND_EDGES
SHARPEN
SMOOTH
SMOOTH_MORE
Exemplo com o filtro de desfoque:
from PIL import Image, ImageFilter
img = Image.open("forest.jpg")
img_blurred = img.filter(ImageFilter.BLUR)
img_blurred.save("forest_blur.jpg")
