Trabajo con imágenes en PHP: resize, crop y optimización
\n\nEl procesamiento de imágenes es una de las tareas clave en el desarrollo de aplicaciones web. Ya sean avatares de usuarios, vistas previas para noticias o galerías de productos — casi siempre necesitará cambiar el tamaño (resize) y recortar (crop) imágenes. En PHP existen dos bibliotecas principales para esto: GD (integrada) e Imagick (extensión basada en ImageMagick).
\n\nEn este artículo analizaremos ambos enfoques, mostraremos ejemplos de código funcionales y daremos recomendaciones sobre qué biblioteca elegir para su proyecto.
\n\n1. Biblioteca GD (GDLib)
\n\nGD es una extensión estándar de PHP, disponible prácticamente en cualquier hosting. Soporta los formatos principales: JPEG, PNG, GIF, WEBP (desde PHP 7.1+). Su desventaja es una calidad de remuestreo inferior en comparación con Imagick, pero para la mayoría de las tareas sus capacidades son suficientes.
\n\n1.1. Cambio de tamaño (resize) con GD
\n\nLa función imagecopyresampled() crea una nueva imagen con interpolación (suavizado). Ejemplo de escalado a un ancho de 300px manteniendo las proporciones:
<?php\nfunction resizeImageGD($srcFile, $destFile, $newWidth = 300) {\n // Obtenemos las dimensiones de la imagen original\n list($width, $height, $type) = getimagesize($srcFile);\n \n // Creamos el recurso de la imagen original según el tipo\n switch ($type) {\n case IMAGETYPE_JPEG:\n $src = imagecreatefromjpeg($srcFile);\n break;\n case IMAGETYPE_PNG:\n $src = imagecreatefrompng($srcFile);\n break;\n case IMAGETYPE_GIF:\n $src = imagecreatefromgif($srcFile);\n break;\n default:\n return false;\n }\n \n // Calculamos la nueva altura proporcionalmente\n $ratio = $width / $height;\n $newHeight = intval($newWidth / $ratio);\n \n // Creamos una imagen vacía del tamaño deseado\n $dst = imagecreatetruecolor($newWidth, $newHeight);\n \n // Habilitamos el canal alfa para PNG/GIF\n imagealphablending($dst, false);\n imagesavealpha($dst, true);\n \n // Remuestreo (copia con recálculo de píxeles)\n imagecopyresampled($dst, $src, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);\n \n // Guardamos el resultado\n imagejpeg($dst, $destFile, 85); // calidad 85%\n \n // Liberamos memoria\n imagedestroy($src);\n imagedestroy($dst);\n \n return true;\n}\n\n// Uso:\nresizeImageGD('photo.jpg', 'photo_thumb.jpg', 300);\n?>\n\n1.2. Recorte (crop) con GD
\n\nPara recortar usamos la función imagecopy() o imagecopyresampled() especificando el área. Ejemplo — recortamos un cuadrado central de 200x200:
<?php\nfunction cropCenterGD($srcFile, $destFile, $cropSize = 200) {\n list($width, $height, $type) = getimagesize($srcFile);\n \n // Determinamos el tipo\n $src = imagecreatefromjpeg($srcFile); // para el ejemplo JPEG\n \n // Calculamos las coordenadas del cuadrado central\n $x = ($width - $cropSize) / 2;\n $y = ($height - $cropSize) / 2;\n \n // Si la imagen original es más pequeña que el tamaño de recorte — no recortamos\n if ($width < $cropSize || $height < $cropSize) {\n $cropSize = min($width, $height);\n $x = 0;\n $y = 0;\n }\n \n $dst = imagecreatetruecolor($cropSize, $cropSize);\n imagecopy($dst, $src, 0, 0, $x, $y, $cropSize, $cropSize);\n \n imagejpeg($dst, $destFile, 90);\n imagedestroy($src);\n imagedestroy($dst);\n}\n\ncropCenterGD('photo.jpg', 'cropped.jpg', 200);\n?>\n\n2. Biblioteca Imagick
\n\nImagick es una potente extensión que proporciona una interfaz orientada a objetos para ImageMagick. Soporta más de 200 formatos, excelente calidad de remuestreo, trabajo con colores, filtros y animación. Requiere instalación en el servidor (no siempre disponible en hosting baratos).
También en la biblioteca
Monitoreo de aplicaciones TypeScript con Appmetrics
Trabajo con S3 y almacenamiento en la nube en Node.js: biblioteca @aws-sdk/client-s3
TypeStack/routing-controllers para TypeScript: guía completa con ejemplos
Trabajo con fechas en C# (.NET): revisión de bibliotecas y herramientas integradas