Como redimensionar imagens com Pillow em Python

Publicado em: 28/02/2026
Tempo de leitura: 10 minutos

Redimensionar imagens é uma das tarefas mais comuns e fundamentais no processamento de dados visuais. Seja para otimizar o carregamento de um site, preparar um dataset para Machine Learning ou automatizar a criação de miniaturas (thumbnails), saber como manipular dimensões de arquivos gráficos de forma programática economiza horas de trabalho manual. No ecossistema de desenvolvimento, o Python se destaca como a ferramenta preferencial para essas automações devido à sua simplicidade e ao vasto conjunto de bibliotecas em Python disponíveis para tratamento de mídia. A biblioteca Pillow, uma bifurcação moderna da antiga PIL (Python Imaging Library), é a escolha padrão da indústria para quem deseja aprender como redimensionar imagens com Pillow em Python com eficiência e alta qualidade.

O que é o Pillow e por que utilizá-lo?

O Pillow é uma biblioteca de código aberto que adiciona recursos de edição de imagem ao seu interpretador Python. Diferente de ferramentas complexas de edição gráfica, o Pillow foca em operações rápidas e eficientes, como rotação, conversão de formatos e, principalmente, redimensionamento. Ele suporta uma vasta gama de formatos, incluindo JPEG, PNG, BMP, GIF e WebP.

A grande vantagem de utilizar scripts para essa tarefa, em vez de softwares como Photoshop, é a escalabilidade. Com poucas linhas de código, você pode processar milhares de fotos em segundos. Se você já domina a lógica de programação com Python, verá que manipular objetos de imagem é tão intuitivo quanto manipular listas ou dicionários. Além disso, o Pillow é leve e possui uma documentação extensa mantida pela comunidade global de desenvolvedores.

Preparando o Ambiente de Desenvolvimento

Antes de começarmos a escrever nossa solução, precisamos garantir que o ambiente esteja configurado corretamente. O Pillow não vem instalado nativamente no Python, por isso utilizaremos o gerenciador de pacotes pip.

Instalando a Biblioteca

Abra o seu terminal ou prompt de comando e execute o seguinte comando para instalar bibliotecas no Python específicas para este projeto:

Bash
pip install Pillow

Caso você esteja utilizando o VS Code, certifique-se de que o seu ambiente virtual venv no Python esteja ativado para evitar conflitos entre diferentes versões de pacotes em seus projetos. Uma vez instalado, você pode verificar a versão instalada importando o módulo e imprimindo o atributo de versão.

Como abrir e visualizar informações de uma imagem

O primeiro passo para redimensionar uma imagem é carregá-la na memória do computador. O Pillow utiliza a classe Image para representar o arquivo gráfico como um objeto Python. É uma boa prática verificar as dimensões originais antes de aplicar qualquer transformação.

Python
from PIL import Image

# Abrindo o arquivo
imagem = Image.open("foto.jpg")

# Exibindo informações básicas
largura, altura = imagem.size
print(f"Dimensões originais: {largura}x{altura}")
print(f"Formato: {imagem.format}")

Nesta etapa, é fundamental gerenciar bem o caminho dos arquivos. Erros comuns como o FileNotFoundError em Python ocorrem frequentemente se o script for executado em uma pasta diferente daquela onde a imagem reside. Sempre verifique se o nome do arquivo e a extensão estão corretos.

Redimensionamento Básico com o método resize

O método mais direto para alterar o tamanho de uma imagem é o resize(). Ele aceita uma tupla contendo a nova largura e a nova altura. É importante notar que este método retorna uma nova cópia da imagem, preservando o objeto original intacto.

Exemplo de redimensionamento fixo

Python
from PIL import Image

imagem = Image.open("entrada.png")
# Definindo o novo tamanho
novo_tamanho = (800, 600)
imagem_redimensionada = imagem.resize(novo_tamanho)

# Salvando o resultado
imagem_redimensionada.save("saida_800x600.png")

Embora funcional, o redimensionamento simples pode causar distorções (“esticar” ou “achatar” a foto) se você não calcular a proporção correta entre largura e altura (aspect ratio). Para manter a proporção, precisamos de um pequeno cálculo matemático.

Mantendo a Proporção da Imagem (Aspect Ratio)

Para evitar que a imagem fique deformada, calculamos a nova altura baseada em uma largura fixa (ou vice-versa). Isso é essencial para manter a integridade visual do conteúdo. No Python, podemos usar o operadores em Python de divisão para descobrir o percentual de redução.

Python
largura_desejada = 500
w_percent = (largura_desejada / float(imagem.size[0]))
h_size = int((float(imagem.size[1]) * float(w_percent)))

imagem_proporcional = imagem.resize((largura_desejada, h_size), Image.Resampling.LANCZOS)

O uso do filtro Image.Resampling.LANCZOS (ou ANTIALIAS em versões mais antigas) é altamente recomendado. Ele aplica uma suavização que evita que a imagem perca muita qualidade ou apresente serrilhados após a redução.

Uso do método thumbnail para Redimensionamento Inteligente

O Pillow oferece uma alternativa conveniente ao resize() chamada thumbnail(). Este método é projetado especificamente para criar versões menores de uma imagem mantendo a proporção original automaticamente. Ele altera a imagem “in-place”, ou seja, modifica o objeto existente em vez de criar um novo.

Python
imagem = Image.open("paisagem.jpg")
# O método mudará a imagem para caber dentro de 400x400 mantendo o aspecto
imagem.thumbnail((400, 400))
imagem.save("miniatura.jpg")

A maior diferença aqui é que o thumbnail() nunca aumentará a imagem se as dimensões fornecidas forem maiores que as originais, protegendo a nitidez do arquivo.

Automatizando o redimensionamento de múltiplas imagens

A verdadeira força de saber como redimensionar imagens com Pillow em Python aparece ao lidar com pastas inteiras. Podemos combinar o Pillow com o módulo OS em Python ou a biblioteca pathlib para iterar sobre arquivos e processá-los em lote.

Python
import os
from PIL import Image

pasta_origem = "fotos_originais"
pasta_destino = "fotos_otimizadas"

if not os.path.exists(pasta_destino):
    os.makedirs(pasta_destino)

for arquivo in os.listdir(pasta_origem):
    if arquivo.endswith((".jpg", ".png", ".jpeg")):
        img = Image.open(os.path.join(pasta_origem, arquivo))
        img.thumbnail((1024, 1024))
        img.save(os.path.join(pasta_destino, arquivo), optimize=True, quality=85)

Neste exemplo, além de redimensionar, adicionamos os parâmetros optimize=True e quality=85 ao salvar. Isso reduz drasticamente o tamanho do arquivo em disco sem uma perda perceptível de qualidade visual, técnica fundamental para Python para automação de fluxos de trabalho web.

Tratamento de Erros e Exceções no Processamento

Ao lidar com arquivos externos, muitas coisas podem dar errado: arquivos corrompidos, permissões negadas ou formatos não suportados. É vital envolver seu código em blocos de tratamento de erros para garantir que o script não pare no meio do processamento de centenas de imagens.

Utilizar a estrutura try-except em Python permite capturar falhas específicas. Por exemplo, se tentarmos abrir um arquivo de texto como se fosse uma imagem, o Pillow lançará uma exceção UnidentifiedImageError. Tratar isso garante a resiliência do seu software.

Código Completo do Projeto: Redimensionador em Lote Profissional

Abaixo, apresentamos uma solução robusta que unifica os conceitos discutidos. Este script percorre uma pasta, redimensiona as imagens mantendo a proporção e as salva em um novo diretório com otimização de compressão.

Python
import os
from PIL import Image, UnidentifiedImageError

def redimensionar_imagens(diretorio_entrada, diretorio_saida, largura_maxima):
    """
    Redimensiona todas as imagens de um diretório mantendo a proporção.
    """
    # Cria a pasta de saída se não existir
    if not os.path.exists(diretorio_saida):
        os.makedirs(diretorio_saida)
        print(f"Diretório {diretorio_saida} criado.")

    for nome_arquivo in os.listdir(diretorio_entrada):
        caminho_completo = os.path.join(diretorio_entrada, nome_arquivo)
        
        try:
            with Image.open(caminho_completo) as img:
                print(f"Processando: {nome_arquivo}...")
                
                # Cálculo da proporção
                largura_original, altura_original = img.size
                proporcao = largura_maxima / float(largura_original)
                nova_altura = int(float(altura_original) * float(proporcao))
                
                # Redimensionamento com alta qualidade
                img_redimensionada = img.resize((largura_maxima, nova_altura), Image.Resampling.LANCZOS)
                
                # Gerando caminho de saída
                caminho_saida = os.path.join(diretorio_saida, nome_arquivo)
                
                # Salvando com compressão otimizada
                img_redimensionada.save(caminho_saida, optimize=True, quality=90)
                
        except UnidentifiedImageError:
            print(f"Pulado: {nome_arquivo} não é uma imagem válida.")
        except Exception as e:
            print(f"Erro ao processar {nome_arquivo}: {e}")

if __name__ == "__main__":
    # Configurações do script
    INPUT_FOLDER = "meu_album"
    OUTPUT_FOLDER = "meu_album_web"
    MAX_WIDTH = 1200
    
    # Criar pasta de exemplo se for a primeira vez
    if not os.path.exists(INPUT_FOLDER):
        print(f"Por favor, coloque suas imagens na pasta '{INPUT_FOLDER}'")
        os.makedirs(INPUT_FOLDER)
    else:
        redimensionar_imagens(INPUT_FOLDER, OUTPUT_FOLDER, MAX_WIDTH)
        print("Tarefa concluída com sucesso!")

Melhores Práticas e Considerações de Performance

Ao trabalhar com grandes volumes de dados, é importante considerar que o processamento de imagens consome bastante CPU e memória RAM. Se você precisar redimensionar dezenas de milhares de imagens de alta resolução, pode ser interessante explorar o processamento paralelo. O Python permite isso através do módulo multiprocessing, distribuindo a carga entre os núcleos do seu processador.

Outro ponto relevante é o uso de referências externas para aprofundar seu conhecimento. A documentação oficial da Pillow Library é o melhor lugar para explorar filtros avançados de redimensionamento. Além disso, entender os fundamentos do Processamento Digital de Imagens na Wikipédia ajudará você a compreender por que certos algoritmos de interpolação (como Bicubic ou Bilinear) funcionam melhor do que outros dependendo da aplicação.

Dominar o redimensionamento é apenas o começo. Com as mesmas ferramentas, você pode aplicar filtros de nitidez, converter cores para escala de cinza ou até adicionar marcas d’água automaticamente. A versatilidade do Pillow combinada com a clareza do Python torna essas tarefas complexas acessíveis até mesmo para programadores iniciantes.

Perguntas Frequentes

O Pillow consegue redimensionar GIFs animados?

Sim, mas o método básico de redimensionamento pode afetar apenas o primeiro quadro. Para redimensionar GIFs animados mantendo a animação, é necessário iterar por cada frame, redimensioná-los individualmente e remontar a sequência antes de salvar.

Qual a diferença entre Image.Resampling.LANCZOS e Image.Resampling.NEAREST?

LANCZOS é um algoritmo complexo que oferece a melhor qualidade de imagem, ideal para fotografias. NEAREST é o mais rápido, mas produz resultados serrilhados; ele é útil principalmente quando você quer preservar pixels exatos em Pixel Art.

Posso redimensionar imagens diretamente de uma URL?

O Pillow não baixa imagens sozinho. Você deve usar a biblioteca requests em Python para obter o conteúdo da imagem e o módulo io.BytesIO para convertê-lo em um objeto que o Pillow possa abrir.

O comando save() sobrescreve arquivos existentes?

Sim, se você fornecer o mesmo nome de arquivo e caminho para o método save(), o Python sobrescreverá o arquivo original sem aviso prévio. Recomenda-se sempre salvar em uma pasta de saída distinta.

Como redimensionar sem perder a transparência de um arquivo PNG?

O Pillow lida com o canal Alpha (transparência) automaticamente ao abrir arquivos RGBA. Ao redimensionar, a transparência é mantida, desde que você salve o arquivo em um formato que a suporte, como PNG ou WebP.

É possível redimensionar para um tamanho menor mantendo o peso do arquivo leve?

Sim, o tamanho físico (dimensões) impacta o peso, mas o parâmetro quality no salvamento de JPEGs é o maior aliado. Valores entre 70 e 85 geralmente oferecem o melhor equilíbrio entre peso e fidelidade visual.

Por que minha imagem ficou preta ao salvar um PNG como JPEG?

JPEGs não suportam transparência. Se você converter um PNG transparente para JPEG, o fundo transparente pode aparecer preto ou gerar um erro. É necessário criar uma imagem de fundo sólida e “colar” o PNG sobre ela antes de salvar como JPEG.

O Pillow é a biblioteca mais rápida para Python?

Para uso geral e facilidade, sim. No entanto, se performance extrema for o único requisito em ambientes de produção massivos, bibliotecas como Numpy no Python com OpenCV podem oferecer velocidades superiores em operações matemáticas de matrizes de pixels.

Compartilhe:

Facebook
WhatsApp
Twitter
LinkedIn

Conteúdo do artigo

    Artigos relacionados

    FundamentosBibliotecas
    Foto do Leandro Hirt

    Descubra como gerar números aleatórios seguros com secrets

    Você já parou para pensar como o seu computador decide qual será o próximo número em um sorteio? No mundo

    Ler mais

    Tempo de leitura: 9 minutos
    27/02/2026
    Logo do Python ao lado do logo da bilioteca Selenium
    Desenvolvimento WebBibliotecas
    Foto do Leandro Hirt

    Selenium no Python: Automação Web Completa

    A automação web se tornou uma habilidade essencial para programadores que desejam economizar tempo em tarefas repetitivas. O Selenium é

    Ler mais

    Tempo de leitura: 17 minutos
    18/12/2025
    Logo do Plotly em um fundo azul-gelo
    Bibliotecas
    Foto do Leandro Hirt

    Plotly em Python: Como Criar Gráficos Interativos

    Aprenda a criar gráficos interativos com Plotly em Python. Guia completo com exemplos práticos de visualização de dados, desde a

    Ler mais

    Tempo de leitura: 14 minutos
    12/12/2025
    Logo do Python com o texto 'asyncio'
    Bibliotecas
    Foto do Leandro Hirt

    Como usar o asyncio no Python: Programação Assíncrona

    Aprenda como usar o asyncio no Python para criar aplicações mais rápidas e eficientes. Guia completo com exemplos práticos de

    Ler mais

    Tempo de leitura: 14 minutos
    11/12/2025
    Foto de um calendário
    FundamentosBibliotecas
    Foto do Leandro Hirt

    Datas e Horas no Python com datetime

    Aprenda a trabalhar com datas e horas no Python usando o módulo datetime. Guia completo com exemplos práticos de formatação,

    Ler mais

    Tempo de leitura: 13 minutos
    10/12/2025
    Logo do Python e do MySQL com um símbolo de '+' entre as logos
    Banco de DadosBibliotecas
    Foto do Leandro Hirt

    Como Conectar Python ao MySQL de Forma Fácil

    Aprenda como conectar Python ao MySQL passo a passo. Tutorial completo com MySQL Connector, SQLAlchemy, exemplos de código para inserir,

    Ler mais

    Tempo de leitura: 19 minutos
    07/12/2025