Pillow
Pillow é o fork mantido do PIL - a biblioteca padrão para abrir, converter, redimensionar, cortar e salvar imagens em pipelines Python, manipuladores de upload web e pré-processamento de ML.
Busque em todas as páginas da documentação
Pillow é o fork mantido do PIL - a biblioteca padrão para abrir, converter, redimensionar, cortar e salvar imagens em pipelines Python, manipuladores de upload web e pré-processamento de ML.
from PIL import Image
with Image.open("photo.jpg") as img:
img = ImageOps.exif_transpose(img)
img.thumbnail((800, 800))
img.save("preview.webp", format="WEBP", quality=85)Quando usar:
from __future__ import annotations
from io import BytesIO
from pathlib import Path
from PIL import Image, ImageOps, UnidentifiedImageError
MAX_BYTES = 5 * 1024 * 1024
ALLOWED = {"JPEG", "PNG", "WEBP"}
def make_thumbnail(data: bytes, max_edge: int = 256) -> bytes:
if len(data) > MAX_BYTES:
raise ValueError("arquivo muito grande")
try:
with Image.open(BytesIO(data)) as img:
if img.format not in ALLOWED:
raise ValueError(f"formato não suportado {img.format}")
img = ImageOps.exif_transpose(img)
img = img.convert("RGB")
img.thumbnail((max_edge, max_edge))
out = BytesIO()
img.save(out, format="WEBP", quality=80, method=6)
return out.getvalue()
except UnidentifiedImageError as exc:
raise ValueError("não é uma imagem") from exc
if __name__ == "__main__":
sample = Path("photo.jpg").read_bytes()
Path("thumb.webp").write_bytes(make_thumbnail(sample))O que isto demonstra:
exif_transpose corrige fotos de celular rotacionadasconvert("RGB") normaliza os modos antes da exportação WEBPBytesIO em memória para manipuladores de APIRGB, RGBA, L (escala de cinza), P (paleta) - converter antes de formatos que não suportam alfa.resize, thumbnail, crop, rotate, módulo filter para blur/sharpen.format=; configurações de qualidade variam por codec.| Tarefa | API |
|---|---|
| Caixa delimitadora máxima | thumbnail((w, h)) |
| Dimensões exatas | resize((w, h), Image.Resampling.LANCZOS) |
| Remover EXIF | img.getexif().clear() ou salvar sem exif |
| Desenhar texto | ImageDraw.Draw(img).text(...) |
# Verificar dimensões sem decodificação completa (onde suportado)
with Image.open(path) as img:
width, height = img.sizeImageOps.exif_transpose.convert("RGB") em um fundo branco primeiro.img.format após abrir.thumbnail, depois resize opcional.| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
wand (ImageMagick) | Rasterização complexa de PDF/PSD/SVG | Dependências mais simples (binário ImageMagick necessário) |
opencv-python | Pipelines de CV, detecção de faces | Microserviço simples de thumbnail |
torchvision.transforms | Apenas aumentos em tempo de treinamento | Sanitização geral de upload |
| SaaS image CDN | Descarregar transformações na borda | Cargas de trabalho air-gapped ou sensíveis a custo |
Requer o plugin pillow-heif - caso contrário, converta no cliente ou rejeite com erro claro.
Mantenha o modo RGBA; não converta para RGB antes de salvar.
Sim, com builds de camada slim - observe o tamanho do pacote e as dependências de bibliotecas nativas.
Use Image.alpha_composite com uma camada de marca d'água PNG transparente.
Image.Resampling.LANCZOS para downscale; NEAREST para pixel art.
Remova o EXIF de localização em uploads de usuários antes de publicar - requisito de privacidade.
Versões recentes do Pillow adicionam AVIF se libavif estiver presente - verifique na imagem de implantação de destino.
Gere um PNG de cor sólida 10x10 em testes via Image.new("RGB", (10, 10), "red").
Não compartilhe objetos Image mutáveis entre threads - abra por tarefa.
data = await file.read() então passe os bytes para o pipeline BytesIO com limites de tamanho.
Versões de Stack: Esta página foi escrita para Python 3.14.0 (estável 3.14, manutenção 3.13), FastAPI 0.115+, Django 5.2, Flask 3.1, Pydantic 2, PyTorch 2.6+, pandas 2.2+, Polars 1.x, ruff 0.9+, e uv 0.6+.
Revisado por Chris St. John·Última atualização: 19 de jul. de 2026