Atualizado: 10/12/2024

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 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.

Uma floresta

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 e height: 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:

Imagem rotacionada em 90 graus com a biblioteca Pillow

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")
Um lobo sobreposta em uma floresta

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 imagem

  • Image.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")
Imagem com filtro de desfoque aplicado
Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com