Trabajo con imágenes en PHP: cambio de tamaño y recorte (resize, crop)
El procesamiento de imágenes es una de las tareas más comunes en el desarrollo de aplicaciones web. Carga de avatares, creación de miniaturas, adaptación de imágenes a diferentes resoluciones de pantalla: todo esto requiere cambio de tamaño (resize) y recorte (crop). En PHP, existen dos herramientas principales para estos fines: la extensión integrada GD y la biblioteca más potente Imagick. En este artículo, analizaremos ambos enfoques con ejemplos prácticos.
1. Extensión GD (herramienta estándar)
GD es la extensión más popular y accesible para trabajar con imágenes. Está integrada en la mayoría de las distribuciones de PHP y no requiere instalación adicional. GD admite los formatos principales: JPEG, PNG, GIF, WebP.
1.1. Cambio de tamaño (resize) manteniendo la proporción
La tarea clásica es reducir una imagen grande a un ancho determinado, manteniendo la relación de aspecto. A continuación se muestra un ejemplo de una función que escala la imagen al ancho especificado.
<?phpfunction resizeImage($srcFile, $destFile, $newWidth) { // Obtenemos información de la imagen original list($width, $height, $type) = getimagesize($srcFile);
// Calculamos la nueva altura proporcionalmente $ratio = $width / $height; $newHeight = $newWidth / $ratio;
// Creamos un lienzo para la nueva imagen $srcImage = imagecreatefromjpeg($srcFile); // para JPEG $destImage = imagecreatetruecolor($newWidth, $newHeight);
// Copiamos y redimensionamos imagecopyresampled($destImage, $srcImage, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);
// Guardamos el resultado imagejpeg($destImage, $destFile, 90); // calidad 90%
// Liberamos memoria imagedestroy($srcImage); imagedestroy($destImage);}
// Ejemplo de usoresizeImage('photo.jpg', 'photo_thumb.jpg', 300);?>Para trabajar con PNG o GIF, es necesario usar las funciones imagecreatefrompng() y imagecreatefromgif(), así como guardar mediante imagepng() o imagegif().
1.2. Recorte de imagen (crop) centrado
A menudo se requiere no solo reducir, sino recortar un área cuadrada del centro de la imagen. Esto se llama crop centrado.
<?phpfunction cropCenter($srcFile, $destFile, $cropSize) { list($width, $height, $type) = getimagesize($srcFile);
// Determinamos las coordenadas para recortar el cuadrado del centro $srcX = ($width - $cropSize) / 2; $srcY = ($height - $cropSize) / 2;
// Si la imagen es más pequeña que el tamaño requerido, simplemente escalamos if ($width < $cropSize || $height < $cropSize) { $ratio = min($cropSize / $width, $cropSize / $height); $newWidth = $width * $ratio; $newHeight = $height * $ratio; $srcImage = imagecreatefromjpeg($srcFile); $destImage = imagecreatetruecolor($cropSize, $cropSize); // Rellenamos con fondo blanco $white = imagecolorallocate($destImage, 255, 255, 255); imagefill($destImage, 0, 0, $white); // Copiamos centrando imagecopyresampled($destImage, $srcImage, ($cropSize - $newWidth) / 2, ($cropSize - $newHeight) / 2, 0, 0, $newWidth, $newHeight, $width, $height); } else { $srcImage = imagecreatefromjpeg($srcFile); $destImage = imagecreatetruecolor($cropSize, $cropSize); imagecopyresampled($destImage, $srcImage, 0, 0, $srcX, $srcY, $cropSize, $cropSize, $cropSize, $cropSize); }
imagejpeg($destImage, $destFile, 90); imagedestroy($srcImage); imagedestroy($destImage);}
// Ejemplo: cuadrado de 200x200 desde el centrocropCenter('photo.jpg', 'photo_cropped.jpg', 200);?>2. Biblioteca Imagick (herramienta avanzada)
Imagick es un envoltorio de PHP para la potente utilidad ImageMagick. Ella pre