Manipulando Imagens com a Biblioteca Pillow em 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 precisa ser importado:
from PIL import ImageAbrindo uma Imagem
Neste artigo, utilizaremos a imagem "forest.jpg" como exemplo. Você pode baixar a imagem aqui ou optar por usar qualquer outra de sua preferência.
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() da classe Image:
from PIL import Image
img = Image.open("forest.jpg")Neste caso, a variável img armazenará um objeto da classe Image, que contém os dados da imagem carregada.
Caso o caminho do arquivo seja inválido ou haja algum problema ao abrir a imagem, é recomendável utilizar um bloco try/except para tratar erros de maneira mais segura:
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 oferece vários atributos para acessar informações sobre a imagem:
filename: nome ou caminho do arquivo.format: formato do arquivo, como JPEG ou PNG. Retorna None para imagens criadas pela biblioteca.mode: modo da imagem, como "1", "L", "RGB" ou "CMYK". A lista completa de modos pode ser encontrada na documentação oficial.size: dimensões da imagem como uma tupla (largura, altura).widtheheight: largura e altura da imagem.info: dicionário com metadados adicionais.is_animated: indica se a imagem possui mais de um quadro.n_frames: número de quadros na imagem.
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() é usado para salvar uma imagem em um arquivo. Ele exige o caminho de destino como parâmetro:
from PIL import Image
img = Image.open("forest.jpg")
img.save("forest_new.jpg")Rotacionando Imagens
O método rotate() permite girar uma imagem. O ângulo de rotação é especificado em graus:
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() permite recortar partes da imagem. O método aceita uma tupla com as coordenadas da área a ser recortada: (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() com uma tupla de largura e altura desejadas:
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() com um fator de escala. Por exemplo, para reduzir a imagem pela metade:
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(). Esse método requer que você forneça a imagem a ser sobreposta e as coordenadas onde ela será posicionada na imagem de base.
No exemplo abaixo, utilizaremos duas imagens: "forest.jpg", que serve como plano de fundo, e "wolf.png", que será sobreposta. Ambas devem estar disponíveis na mesma pasta do script ou nos caminhos especificados. Você pode baixar a imagem do lobo aqui para seguir o exemplo.
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
positiondefine 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. - O terceiro parâmetro do método
paste()é 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.
Espelhamento de Imagens
O método transpose() permite espelhar ou rotacionar imagens. Os valores possíveis para o método são:
Image.Transpose.FLIP_LEFT_RIGHT: espelha horizontalmente.Image.Transpose.FLIP_TOP_BOTTOM: espelha verticalmente.Image.Transpose.ROTATE_90: rotaciona 90 graus.Image.Transpose.ROTATE_180: rotaciona 180 graus.Image.Transpose.ROTATE_270: rotaciona 270 graus.Image.Transpose.TRANSPOSE: transpõe a imagemImage.Transpose.TRANSVERSE: transpõe e rotaciona 90 graus.
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() com um filtro do módulo ImageFilter. Os filtros disponíveis:
BLURCONTOURDETAILEDGE_ENHANCEEDGE_ENHANCE_MOREEMBOSSFIND_EDGESSHARPENSMOOTHSMOOTH_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")
Documentação oficial: