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 Image
Abrindo 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).width
eheight
: 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
position
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. - 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:
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")
Documentação oficial: