Trabajo con imágenes en PHP: guía completa de GD e Imagick

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Trabajo con imágenes en PHP: librerías GD e Imagick



El procesamiento de imágenes es una de las tareas clave en el desarrollo web. En PHP se utilizan dos librerías principales: GD (integrada) e Imagick (envoltura sobre ImageMagick). En este artículo analizaremos sus capacidades, aprenderemos a redimensionar, recortar, superponer marcas de agua y optimizar imágenes.



1. Librería GD



GD es una extensión estándar de PHP, disponible en la mayoría de los alojamientos web. Permite crear, modificar y guardar imágenes en formatos JPEG, PNG, GIF, WebP.



Instalación y verificación:

<?php// Verificamos si la extensión GD está instaladaif (extension_loaded('gd') && function_exists('gd_info')) {    echo "GD está instalada: ";    print_r(gd_info());} else {    echo "GD no encontrada";}?>


1.1 Redimensionamiento de imagen (resize)



El escenario más común es reducir la imagen al tamaño deseado manteniendo las proporciones.



<?phpfunction resizeImage($sourcePath, $destPath, $newWidth, $newHeight) {    // Obtenemos las dimensiones de la imagen original    list($width, $height, $type) = getimagesize($sourcePath);        // Creamos un recurso a partir del archivo original    switch ($type) {        case IMAGETYPE_JPEG:            $source = imagecreatefromjpeg($sourcePath);            break;        case IMAGETYPE_PNG:            $source = imagecreatefrompng($sourcePath);            break;        case IMAGETYPE_GIF:            $source = imagecreatefromgif($sourcePath);            break;        default:            return false;    }        // Creamos la nueva imagen    $newImage = imagecreatetruecolor($newWidth, $newHeight);        // Mantenemos la transparencia para PNG/GIF    imagealphablending($newImage, false);    imagesavealpha($newImage, true);        // Copiamos y redimensionamos    imagecopyresampled($newImage, $source, 0, 0, 0, 0, $newWidth, $newHeight, $width, $height);        // Guardamos el resultado    imagejpeg($newImage, $destPath, 85); // Calidad 85%        // Liberamos memoria    imagedestroy($source);    imagedestroy($newImage);    return true;}

// Ejemplo de usoresizeImage('photo.jpg', 'photo_thumb.jpg', 300, 200);?>


1.2 Recorte de imagen (crop)



El recorte permite seleccionar la parte central de la imagen con el tamaño deseado.



<?phpfunction cropCenter($sourcePath, $destPath, $cropWidth, $cropHeight) {    list($width, $height) = getimagesize($sourcePath);    $source = imagecreatefromjpeg($sourcePath);        // Calculamos las coordenadas del centro    $x = ($width - $cropWidth) / 2;    $y = ($height - $cropHeight) / 2;        $newImage = imagecreatetruecolor($cropWidth, $cropHeight);    imagecopyresampled($newImage, $source, 0, 0, $x, $y, $cropWidth, $cropHeight, $cropWidth, $cropHeight);        imagejpeg($newImage, $destPath, 90);    imagedestroy($source);    imagedestroy($newImage);}

cropCenter('photo.jpg', 'photo_cropped.jpg', 400, 400);?>


1.3 Superposición de marca de agua



Añadir texto o logotipo sobre la imagen.



<?phpfunction addWatermarkText($sourcePath, $destPath, $text = "© PythonLib.ru") {    $source = imagecreatefromjpeg($sourcePath);    $width = imagesx($source);    $height = imagesy($source);        // Color del texto (blanco con transparencia)    $color = imagecolorallocatealpha($source, 255, 255, 255, 50);        // Tamaño de fuente (usamos fuente integrada)    $fontSize = 5;    $x = 10;    $y = $height - 20;        imagestring($source, $fontSize, $x, $y, $text, $color);        imagejpeg($source, $destPath, 90);    imagedestroy($source);}

addWatermarkText('photo.jpg', 'photo_watermarked.jpg');?>


2. Librería Imagick



Imagick es una extensión de PHP que proporciona una interfaz orientada a objetos para trabajar con ImageMagick. Ofrece más funciones y mejor rendimiento que GD, especialmente para imágenes grandes y formatos complejos.



Instalación y verificación:

<?php// Verificamos si la extensión Imagick está instaladaif (extension_loaded('imagick')) {    $imagick = new Imagick();    echo "Imagick instalado, versión: " . $imagick->getVersion()['versionString'];} else {    echo "Imagick no encontrado";}?>


2.1 Redimensionamiento de imagen (resize)



Con Imagick, redimensionar una imagen es mucho más sencillo.



<?phpfunction resizeImageImagick($sourcePath, $destPath, $newWidth, $newHeight) {    $image = new Imagick($sourcePath);        // Redimensionamos manteniendo la proporción    $image->resizeImage($newWidth, $newHeight, Imagick::FILTER_LANCZOS, 1);        // Guardamos el resultado    $image->writeImage($destPath);        // Liberamos memoria    $image->destroy();}

// Ejemplo de usoresizeImageImagick('photo.jpg', 'photo_thumb_imagick.jpg', 300, 200);?>


2.2 Recorte de imagen (crop)



Recortar la parte central de la imagen con Imagick.



<?phpfunction cropCenterImagick($sourcePath, $destPath, $cropWidth, $cropHeight) {    $image = new Imagick($sourcePath);        // Obtenemos las dimensiones    $width = $image->getImageWidth();    $height = $image->getImageHeight();        // Calculamos las coordenadas del centro    $x = ($width - $cropWidth) / 2;    $y = ($height - $cropHeight) / 2;        // Recortamos    $image->cropImage($cropWidth, $cropHeight, $x, $y);        // Guardamos    $image->writeImage($destPath);    $image->destroy();}

cropCenterImagick('photo.jpg', 'photo_cropped_imagick.jpg', 400, 400);?>


2.3 Superposición de marca de agua



Añadir texto o imagen como marca de agua.



<?phpfunction addWatermarkImagick($sourcePath, $destPath, $text = "© PythonLib.ru") {    $image = new Imagick($sourcePath);        // Creamos un objeto de dibujo    $draw = new ImagickDraw();    $draw->setFillColor(new ImagickPixel('rgba(255, 255, 255, 0.5)'));    $draw->setFontSize(30);    $draw->setGravity(Imagick::GRAVITY_SOUTHEAST);        // Añadimos el texto    $image->annotateImage($draw, 10, 10, 0, $text);        // Guardamos    $image->writeImage($destPath);    $image->destroy();}

addWatermarkImagick('photo.jpg', 'photo_watermarked_imagick.jpg');?>


3. Comparación: GD vs Imagick



Característica GD Imagick
Disponibilidad Integrado en PHP, disponible en casi todos los alojamientos Requiere instalación adicional de ImageMagick
Rendimiento Bueno para imágenes pequeñas y medianas Excelente para imágenes grandes y procesamiento por lotes
Formatos JPEG, PNG, GIF, WebP Más de 100 formatos (TIFF, PDF, SVG, etc.)
API Procedural (funciones) Orientada a objetos
Transparencia Soporte básico Soporte avanzado (canal alfa, máscaras)


4. Optimización de imágenes



Independientemente de la librería, es importante optimizar las imágenes para la web. Aquí algunos consejos:



  • Elige el formato correcto: JPEG para fotos, PNG para gráficos con transparencia, WebP para máxima compresión.
  • Ajusta la calidad: Para JPEG, un valor de 70-85% suele ser suficiente.
  • Redimensiona antes de subir: No subas imágenes de 4000px si solo las mostrarás en 800px.
  • Usa caché: Guarda las versiones procesadas para no reprocesar cada vez.


5. Conclusión



GD e Imagick son dos potentes herramientas para trabajar con imágenes en PHP. GD es ideal para tareas simples y está disponible en casi todos los entornos. Imagick ofrece más funciones y mejor rendimiento para proyectos complejos. La elección depende de tus necesidades específicas y del entorno de alojamiento.



¡Experimenta con ambas librerías y elige la que mejor se adapte a tu proyecto!

Recommendations