Redimensionamento sensível ao conteúdo com PHP e ImageMagick
Neste post, vamos explorar uma técnica poderosa para redimensionar imagens de forma sensível ao conteúdo usando PHP e ImageMagick. Com o recurso liquid rescale, disponível pela extensão Imagick, você consegue ajustar as dimensões da imagem de forma inteligente, preservando os detalhes principais.
O que é redimensionamento sensível ao conteúdo?
O redimensionamento sensível ao conteúdo, muitas vezes chamado de seam carving, permite ajustar as dimensões de uma imagem removendo ou inserindo pixels em áreas com informação visual menos importante, em vez de escalar a imagem inteira de forma uniforme. Ao contrário dos métodos tradicionais de redimensionamento, essa abordagem minimiza a distorção do assunto principal das suas imagens.
Pré-requisitos
Antes de começar, confira se você tem o seguinte:
- Uma versão compatível do PHP 8.x
- A extensão Imagick habilitada na sua instalação do PHP
- ImageMagick na versão 6.5.3-10 ou posterior (as versões 6 e 7 são compatíveis)
Pré-requisitos adicionais
Para a funcionalidade de redimensionamento sensível ao conteúdo:
- A biblioteca liblqr precisa estar instalada (pacote
liblqr-1-0no Debian/Ubuntu) - O ImageMagick precisa ser compilado com suporte a liblqr
Como usar o liquid rescale em PHP
O ImageMagick oferece o método liquidRescaleImage, que faz o redimensionamento sensível ao conteúdo. Veja
como implementá-lo em um script CLI local com um JPEG confiável de quadro único:
<?php
$image = new Imagick();
try {
$image->readImage('input.jpg');
// Define your target dimensions
$targetWidth = 400;
$targetHeight = 300;
// Parameters for liquid rescale
$deltaX = 1; // Maximum sideways step of a seam
$rigidity = 0; // Penalty for bending a seam
// Perform content-aware resizing
$image->liquidRescaleImage($targetWidth, $targetHeight, $deltaX, $rigidity);
// Write the result
$image->writeImage('output.jpg');
} catch (ImagickException $e) {
fwrite(STDERR, "Image resizing failed.\n");
$failed = true;
} finally {
$image->clear();
}
if (isset($failed)) {
exit(1);
}
Ajuste fino dos parâmetros
A operação de liquid rescale é controlada por dois parâmetros principais:
- deltaX: deslocamento lateral máximo de uma costura. Zero produz costuras retas; valores maiores dão às costuras mais liberdade para contornar o conteúdo da imagem.
- rigidity: uma penalidade não negativa para costuras que se curvam. Zero não adiciona penalidade; valores maiores favorecem costuras mais retas. Isso não garante que um rosto ou outro elemento importante seja preservado.
Esses significados vêm da documentação de parâmetros do Imagick. Ao escolher os valores, inspecione o resultado em imagens representativas.
Considerações de desempenho
O redimensionamento sensível ao conteúdo pode consumir muitos recursos, especialmente em imagens grandes. Veja algumas estratégias de otimização:
- Reduza as dimensões de entrada antes do seam carving quando a resolução original não for necessária
- Implemente sistemas de fila para processamento em lote
- Combine o redimensionamento padrão com o liquid rescale:
<?php
$image = new Imagick();
try {
$image->readImage('input.jpg');
// Initial standard resize
$image->resizeImage(800, 600, Imagick::FILTER_LANCZOS, 1, true);
// Follow with content-aware adjustment
$image->liquidRescaleImage(400, 300, 1, 0);
$image->writeImage('optimized-output.jpg');
} catch (ImagickException $e) {
fwrite(STDERR, "Image resizing failed.\n");
$failed = true;
} finally {
$image->clear();
}
if (isset($failed)) {
exit(1);
}
Problemas comuns e soluções
Erros de alocação de memória
O memory_limit do PHP não limita de forma confiável as alocações nativas do ImageMagick. Configure
os limites de recursos e a política de segurança do ImageMagick,
incluindo memória, cache em disco, dimensões e tempo de processamento, de acordo com a sua carga de
trabalho. Exponha as falhas por limite de recursos em vez de tentar processar indefinidamente a
mesma imagem grande demais.
Suporte ao liblqr ausente
Verifique a instalação com:
magick -list configure | grep -i lqr
No ImageMagick 6, use convert no lugar de magick. Procure por lqr nos delegates configurados.
A CLI e a extensão PHP podem usar builds diferentes do ImageMagick; verifique também php --ri imagick.
Se o build vinculado ao Imagick não tiver liblqr, instale um build com esse delegate e reinicie o PHP.
Preservação da qualidade
Para reduções de tamanho significativas:
- Aplique várias operações de redimensionamento graduais
- Combine com filtros de nitidez após o redimensionamento
- Mantenha a proporção original sempre que possível
Conclusão
O redimensionamento sensível ao conteúdo permite manter a integridade da imagem enquanto você ajusta as dimensões para destacar as áreas importantes. Combinando PHP com a funcionalidade liquid rescale do ImageMagick, você pode criar soluções adaptativas de processamento de imagens que respondem ao conteúdo visual.
Para necessidades de processamento de imagens em escala corporativa, considere a API de processamento de imagens da Transloadit, que lida automaticamente com fluxos de trabalho complexos.
Boa programação!
