Como Parar de Sofrer Trabalhando com Imagens em PHP
Qualquer pessoa que já escreveu geração de miniaturas em PHP puro usando a extensão GD lembra dessa dor. Uma dúzia de funções de baixo nível com assinaturas crípticas, cálculos manuais de coordenadas e vazamentos constantes de memória. Com o Imagick, a sintaxe é um pouco melhor, mas tem seu próprio zoológico de métodos.
A biblioteca Intervention Image tem resolvido exatamente esse problema há mais de dez anos. Ela esconde as extensões do sistema atrás de uma interface unificada e legível. O projeto recentemente alcançou a versão v3/v4, onde a arquitetura foi completamente reescrita para versões modernas do PHP.
O que tem dentro da biblioteca
O projeto oferece um wrapper conveniente em torno dos mecanismos gráficos. Você escreve código legível e encadeável, e nos bastidores a biblioteca faz as chamadas de sistema necessárias por conta própria.
O principal destaque aqui são os drivers intercambiáveis. Atualmente, o projeto suporta:
- GD (biblioteca padrão disponível em praticamente qualquer hospedagem)
- Imagick (extensão baseada no ImageMagick)
- libvips (motor rápido com baixo consumo de memória via um driver separado)
Se o servidor não tiver o ImageMagick, você simplesmente troca o driver para GD sem reescrever a lógica de negócio da aplicação. Para serviços de alta carga, você pode conectar o libvips, que funciona várias vezes mais rápido e lida com a RAM de forma mais cuidadosa ao processar imagens pesadas.
Outro detalhe interessante é o suporte completo a imagens animadas (GIF, WebP) em todos os drivers disponíveis. Antes, trabalhar com animações exigia um acoplamento forte ao Imagick.
Como o código fica
Para começar, instale a biblioteca via Composer:
composer require intervention/image
Você vai precisar do PHP 8.3 ou mais recente, a extensão mbstring e um dos módulos gráficos de sua escolha.
Aqui está um exemplo básico que redimensiona uma imagem, aplica uma marca d'água e salva o resultado como WebP ou JPEG:
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver as GdDriver;
use Intervention\Image\Alignment;
use Intervention\Image\Format;
// Инициализируем менеджер с нужным драйвером
$manager = ImageManager::usingDriver(GdDriver::class);
// Читаем исходный файл
$image = $manager->decodePath('images/example.webp');
// Пропорционально меняем размер по высоте
$image->scale(height: 300);
// Накладываем водяной знак в правый нижний угол
$image->insert('images/watermark.png', alignment: Alignment::BOTTOM_RIGHT);
// Кодируем результат с заданным качеством
$encoded = $image->encodeUsingFormat(Format::JPEG, quality: 65);
// Сохраняем готовый файл
$encoded->save('images/example.jpg');
A sintaxe depende de argumentos nomeados do PHP 8 e tipagem estrita com enums como Alignment::BOTTOM_RIGHT e Format::JPEG. Cometer erros com parâmetros agora é muito mais difícil, e o autocomplete do IDE funciona de imediato.
Casos de uso típicos
O pacote não está atrelado a um framework específico, então é igualmente fácil integrar no Laravel, Symfony ou em um microsserviço RoadRunner.
- Geração de avatares e miniaturas. Recorte, ajuste em um quadrado (
crop,cover,scale), remoção de metadados antes de publicar. - Otimização de conteúdo em tempo real. Convertendo PNG e JPEG pesados para WebP ou AVIF modernos com compressão.
- Proteção de direitos autorais. Marca d'água em lote e sobreposição de logotipos antes de servir arquivos para CDN.
- Trabalhando com animações. Recorte ou redimensionamento de GIFs sem perder quadros.
Vale a pena adicionar ao projeto
Se você está escrevendo em PHP 8.3+ e precisa processar arquivos de usuários, Intervention Image vai economizar muito tempo. Essencialmente, é o padrão de fato no ecossistema PHP quando se trata de gráficos.
Uma nuance: se o projeto está preso a versões antigas do PHP como 7.4 ou 8.1, você terá que ficar na branch v2, que tem uma API completamente diferente. Mas para uma stack nova, a biblioteca se encaixa perfeitamente.
Projetos relacionados