Redimensionado según el contenido con PHP e ImageMagick
En este artículo exploramos una técnica potente para redimensionar imágenes según su contenido con PHP e ImageMagick. Al aprovechar la función liquid rescale disponible a través de la extensión Imagick, puedes ajustar de forma inteligente las dimensiones de la imagen conservando los detalles clave.
¿Qué es el redimensionado según el contenido?
El redimensionado según el contenido, a menudo llamado seam carving, permite ajustar las dimensiones de una imagen eliminando o insertando píxeles en áreas con información visual menos importante, en lugar de escalar toda la imagen de forma uniforme. A diferencia de los métodos de redimensionado tradicionales, este enfoque minimiza la distorsión del sujeto en tus imágenes.
Requisitos previos
Antes de comenzar, asegúrate de tener lo siguiente:
- Una versión compatible de PHP 8.x
- La extensión Imagick habilitada en tu instalación de PHP
- ImageMagick versión 6.5.3-10 o posterior (se admiten tanto la versión 6 como la 7)
Requisitos previos adicionales
Para la funcionalidad de redimensionado según el contenido:
- Debe estar instalada la biblioteca liblqr (paquete
liblqr-1-0en Debian/Ubuntu) - ImageMagick debe estar compilado con soporte para liblqr
Cómo usar liquid rescale en PHP
ImageMagick ofrece el método liquidRescaleImage, que realiza el redimensionado según el contenido. Así
puedes implementarlo en un script de CLI local con un JPEG de confianza y de un solo fotograma:
<?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 de los parámetros
La operación de liquid rescale se controla mediante dos parámetros clave:
- deltaX: paso lateral máximo de una costura. Cero produce costuras rectas; los valores mayores dan a las costuras más libertad para moverse alrededor del contenido de la imagen.
- rigidity: una penalización no negativa por curvar las costuras. Cero no añade ninguna penalización; los valores mayores favorecen costuras más rectas. Esto no garantiza que se conserve un rostro u otro elemento importante.
Estos significados provienen de la documentación de parámetros de Imagick. Revisa el resultado en imágenes representativas al elegir los valores.
Consideraciones de rendimiento
El redimensionado según el contenido puede consumir muchos recursos, sobre todo con imágenes grandes. Estas son algunas estrategias de optimización:
- Reduce las dimensiones de entrada antes del seam carving cuando la resolución original no sea necesaria
- Implementa sistemas de colas para el procesamiento por lotes
- Combina el redimensionado estándar con 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 comunes y soluciones
Errores de asignación de memoria
El memory_limit de PHP no limita de forma fiable las asignaciones nativas de ImageMagick. Configura
los límites de recursos y la política de seguridad de ImageMagick,
incluidos la memoria, la caché en disco, las dimensiones y el tiempo de procesamiento, según tu carga
de trabajo. Expón los fallos por límite de recursos en lugar de reintentar indefinidamente con la
misma imagen de tamaño excesivo.
Falta de soporte para liblqr
Verifica la instalación con:
magick -list configure | grep -i lqr
Para ImageMagick 6, usa convert en lugar de magick. Busca lqr entre los delegados configurados.
La CLI y la extensión de PHP pueden usar compilaciones distintas de ImageMagick; comprueba también php --ri imagick.
Si la compilación enlazada con Imagick carece de liblqr, instala una compilación que incluya ese delegado y reinicia PHP.
Preservación de la calidad
Para reducciones de tamaño significativas:
- Aplica varias operaciones de redimensionado graduales
- Combina con filtros de enfoque después del redimensionado
- Mantén la relación de aspecto original cuando sea posible
Para terminar
El redimensionado según el contenido te permite mantener la integridad de la imagen mientras ajustas las dimensiones para centrarte en las áreas importantes. Al combinar PHP con la funcionalidad liquid rescale de ImageMagick, puedes crear soluciones adaptativas de procesamiento de imágenes que responden al contenido visual.
Para necesidades de procesamiento de imágenes a escala empresarial, considera la API de procesamiento de imágenes de Transloadit, que gestiona flujos de trabajo complejos de forma automática.
¡Feliz programación!
