Programación en php

Manipulación de imágenes en php con la clase gd

Manipulación de imágenes en PHP usando GD

Internet sería bastante aburrido sin imágenes. Sin embargo, mantener y manipular cientos o miles de imágenes para tu sitio web puede ser un dolor de cabeza. A medida que cambie el diseño de su sitio, es posible que debas modificar todas tus imágenes, por ejemplo, puede que necesites convertir todas tus imágenes a escala de grises o cambiarles el tamaño al 50% de su tamaño original.  Es posible que también desees comprimir o recortar imágenes diferentes. Hacer esto manualmente consume mucho tiempo y es propenso a errores, pero con un poco de conocimiento de programación puede automatizarse.

En este tutorial, aprenderemos sobre la librería GD (Graphic Draw) en PHP.

Verás cómo se puede usar esta biblioteca para manipular imágenes al redimensionarlas, recortarlas, rotarlas o filtrarlas.

PHP puede hacer mucho más que solo servir HTML a los visitantes. Por ejemplo, tiene la capacidad de manipular imágenes. No solo eso, sino que también puedes crear tus propias imágenes desde cero y luego guardarlas o servirlas a los usuarios.

PHP puede manejar casi todas tus necesidades básicas de manipulación de imágenes usando la biblioteca de GD, abreviatura de Graphic Draw.

Si estás trabajando en Windows, puede incluir el archivo php_gd2.dll como extensión en php.ini. Si está utilizando algo como XAMPP, encontrará el archivo php_gd2.dll en el directorio xampp \ php \ ext. También puedes verificar si GD está instalado en tu sistema usando la función phpinfo();. Si se desplaza por la salida resultante, encontrarás algo similar a lo siguiente.

PHP XAMPP GD
 

El primer paso hacia la manipulación de imágenes usando PHP es cargarlas en la memoria como un recurso de imagen. Esto se puede lograr usando diferentes funciones para diferentes formatos. Todas estas funciones tienen nombres muy similares, por lo que son fáciles de recordar.

La función imagecreatetruecolor () será útil si no tiene un origen de imagen original que desees manipular. Acepta dos parámetros enteros: ancho y alto.  Devolverá un recurso de imagen si todo fue según lo planeado. El recurso de imagen devuelto es básicamente una imagen negra con ancho y alto especificados.

Si planeas manipular imágenes que ya están almacenadas en algún lugar, te beneficiarás del uso de funciones como imagecreatefromjpeg ()imagecreatefrompng () e imagecreatefromgif ().  Estos crearán un recurso de imagen con todos los datos del archivo de imagen cargado. Estas funciones aceptan un único parámetro que especifica la ubicación de la imagen que está cargando, ya sea como una URL o como una ruta de archivo.

La biblioteca GD también le permite crear imágenes a partir de una cadena utilizando la función imagecreatefromstring () en PHP.  Recuerda que deberás usar base64_decode() en la cadena dada antes de imagecreatefromstring(). La función puede detectar automáticamente si el tipo de imagen es JPG, PNG, GIF u otro formato admitido.

Algunas operaciones comunes que es posible que desees realizar en un recurso de imagen son rotación, escala, recorte y volteo.

Puedes rotar una imagen que ya has cargado en el script mediante la función imagerotate().  El ángulo se proporciona como un valor flotante y PHP considera que es el valor de grado para la rotación. En ocasiones, la imagen girada tendrá dimensiones diferentes en comparación con la versión original.  Esto significa que terminará con algún área descubierta después de la rotación. El tercer parámetro de la función imagerotate() se puede usar para especificar el color de fondo del área vacía después de la rotación.

Es muy fácil escalar una imagen usando la biblioteca de GD. Solo tienes que pasar el recurso de imagen así como el ancho y alto a la función imagescale ().  Si omites la altura, GD escalará la imagen al ancho especificado conservando la relación de aspecto. También puede especificar el modo para escalar la imagen. Se puede configurar en IMG_NEAREST_NEIGHBOURIMG_BILINEAR_FIXEDIMG_BICUBIC, etc. Una cosa importante que debe recordar es que esta función devuelve una nueva fuente de imagen escalada en lugar de modificar la original.

Puedes recortar cualquier recurso de imagen usando la función imagecrop () en GD. El primer parámetro es el recurso de la imagen original y el segundo parámetro es un arreglo asociativo con las llaves xyancho y alto, que especifica las dimensiones de posición de la ventana de recorte.

Crop and Rotate Images Using PHP

La imagen de la mariposa de arriba se recortó usando el siguiente código:

1
2
3
4
$im_php = imagecreatefromjpeg('path/to/image');
$size = min(imagesx($im_php), imagesy($im_php));
$im_php = imagecrop($im_php, ['x' => $size*0.4, 'y' => 0, 'width' => $size, 'height' => $size]);
$im_php = imagescale($im_php, 300);

Básicamente, almacenamos la longitud del lado más pequeño en la variable $size. Esta variable se usa para definir el límite de nuestro rectángulo de recorte.  Finalmente, la imagen se reduce de forma tal que tiene solo 300 píxeles de ancho y de largo. Esto nos da una imagen cuadrada de tamaño adecuado.

Las imágenes se pueden voltear horizontalmente, verticalmente o en ambas direcciones usando la función imageflip().  Acepta el recurso de imagen que deseas voltear como primer parámetro y el modo flip como segundo parámetro.El modo Flip se puede establecer en IMG_FLIP_HORIZONTALIMG_FLIP_VERTICAL o IMG_FLIP_BOTH.

La imagen superior izquierda en la figura de arriba es la original.  La imagen superior derecha se creó con IMG_FLIP_HORIZONTAL, la imagen inferior izquierda se creó con IMG_FLIP_VERTICAL y la imagen inferior derecha se creó con IMG_FLIP_BOTH. (La imagen del cuervo es de Pixabay.)

GD también tiene una función muy útil imagefilter() que puede aplicar filtros en diferentes recursos de imágenes cargados usando las funciones de imágenes previas. Esta función puede aceptar varios parámetros según el filtro que esté aplicando.

Para empezar, especifica el recurso de la imagen y el nombre del filtro que deseas aplicar. Puedes establecerlo en uno de los 12 tipos de filtro predefinidos mencionados en los documentos.

  • IMG_FILTER_NEGATE: invierte los colores en la imagen
  • IMG_FILTER_GRAYSCALE: elimina el color de la imagen
  • IMG_FILTER_BRIGHTNESS: hace que la imagen sea más brillante o más oscura
  • IMG_FILTER_CONTRAST: aumenta el contraste de la imagen
  • IMG_FILTER_COLORIZE: matiza la imagen a un color seleccionado
  • IMG_FILTER_EDGEDETECT: resalta los bordes de la imagen
  • IMG_FILTER_EMBOSS: similar a la detección de bordes, pero le da a cada borde una apariencia elevada
  • IMG_FILTER_GAUSSIAN_BLUR: desenfoca la imagen usando el método gaussiano
  • IMG_FILTER_SELECTIVE_BLUR: desenfoca la imagen con el método selectivo
  • IMG_FILTER_MEAN_REMOVAL: un efecto para crear una imagen estilizada
  • IMG_FILTER_SMOOTH: suaviza los bordes dentados de la imagen
  • IMG_FILTER_PIXELATE: hace que la imagen se vea pixelada

Algunos filtros como NEGATEGRAYSCALEEDGE_DETECT y EMBOSS no necesitan ningún dato adicional. Otros filtros, como BRIGHTNESSCONTRAST y SMOOTH pueden aceptar un parámetro adicional que especifica la cantidad de brillo, contraste o suavidad de la imagen final El parámetro PIXELATE te permite especificar dos parámetros adicionales: el tamaño del bloque y el modo de pixelación. Finalmente, el filtro COLORIZE acepta cuatro parámetros que determinan los valores para los componentes rojo, verde y azul, así como también el canal alfa.

La imagen en la esquina superior izquierda es la original. La imagen superior derecha se creó con el filtro COLORIZE, la inferior izquierda se creó con el filtro GRAYSCALE y la imagen de la esquina inferior derecha se creó con el filtro BRIGHTNESS. (Esta imagen de mariposa fue encontrada en Pixabay.)

También debes conocer otras funciones comunes de GD que son útiles de vez en cuando.

Puede determinar el ancho y la altura de un recurso de imagen utilizando las funciones imagesx () e imagesy ().

Otra función llamada getimagesize() también se puede usar para obtener el ancho y alto de una imagen junto con su tipo. Esta función devuelve una matriz con elementos que especifican el ancho, alto y formato de la imagen. Los primeros dos elementos de la matriz describen el ancho y alto, y el tercer elemento contiene una constante que especifica el formato de archivo: uno de IMAGETYPE_PNGIMAGETYPE_GIF, etc.

Una vez que hayas realizado todos los cambios deseados en una imagen, lo más probable es que desees enviarla al navegador o guardarla como un archivo. En cualquier caso, tendrá que usar una de las funciones de salida GD como imagejepg(), imagepng() o imagegif().  Pasarás tu recurso de imagen a una de estas funciones de salida y, si deseas guardar la imagen en un archivo, también deberas especificar un nombre de archivo.  También puedes controlar la calidad de la imagen de salida usando un tercer parámetro opcional dependiendo del tipo de imagen.

Vamos a aplicar el conocimiento que hemos adquirido hasta ahora para hacer algo práctico. En esta sección, vamos a cambiar el tamaño de todas las imágenes JPEG en un directorio en particular para tener un ancho de 640 píxeles.  La altura se calculará automáticamente en función de las dimensiones de la imagen original.

Guardaremos las imágenes redimensionadas en una nueva carpeta llamada Resized. Todas las imágenes originales en este caso tienen las mismas dimensiones, pero el código funcionará correctamente con imágenes que tengan diferentes tamaños y relaciones de aspecto.

01
02
03
04
05
06
07
08
09
10
$directory = 'Nature/';
$images = glob($directory."*.jpg");
 
foreach($images as $image) {
    $im_php = imagecreatefromjpeg($image);
    $im_php = imagescale($im_php, 640);
    $new_height = imagesy($im_php);
    $new_name = str_replace('-1920x1080', '-640x'.$new_height, basename($image));
    imagejpeg($im_php, $directory.'Resized/'.$new_name);
}

En el código anterior, comenzamos utilizando la función glob() para buscar todas las imágenes con una extensión .jpg en el directorio titulado Nature. El archivo de imágenes se almacena en un arreglo y las recorremos una a una. 

Como todas las imágenes que queremos cambiar de tamaño son JPEG, usamos la función imagecreatefromjpeg() para cargarlas en el script.  La función imagescale() se usa para cambiar el tamaño de la imagen a un ancho específico de 640 píxeles en nuestro caso. No hemos especificado una altura fija, por lo que la altura se calculará automáticamente. 

Cada uno de los archivos de imagen originales tenía -1920×1080 anexado a su nombre de archivo para indicar sus dimensiones. Usamos str_replace() en el nombre del archivo original y reemplazamos -1920X1080 con el nuevo tamaño de imagen.

Finalmente, guardamos las imágenes redimensionadas en una carpeta llamada Resized con los nuevos nombres de archivo. También puede pasar un tercer parámetro a la función imagejpeg() para establecer la calidad del archivo de imagen guardado. Si se omite el tercer parámetro, las imágenes se guardan con una calidad predeterminada de 75. 

Esta vez aplicaremos dos filtros diferentes en cada imagen de nuestro directorio y guardaremos el resultado final en un directorio diferente sin hacer ningún cambio en el nombre del archivo. Vamos a sumergirnos en el código y explicaré qué hace cada función más tarde.

01
02
03
04
05
06
07
08
09
10
$directory = 'Nature/';
$images = glob($directory."*.jpg");
 
foreach($images as $image) {
    $im_php = imagecreatefromjpeg($image);
    imagefilter($im_php, IMG_FILTER_GRAYSCALE);
    imagefilter($im_php, IMG_FILTER_CONTRAST, -25);
    $new_name = basename($image);
    imagejpeg($im_php, $directory.'Grayscale/'.$new_name);
}

Como puedes ver, cargamos las imágenes del directorio de Nature exactamente como lo hicimos en el ejemplo anterior. Sin embargo, esta vez utilizaremos la función imagefilter() para aplicar filtros en el recurso de imagen cargado.

Observa que imagefilter() modifica la imagen original y devuelve TRUE o FALSE en función del éxito o el fracaso de la operación. Esto es diferente de la función imagescale() que utilizamos en la sección anterior que devolvió el recurso de imagen escalado.

Otra cosa importante a tener en cuenta es que el filtro de contraste acepta valores de -100 a 100.  Los valores negativos implican más contraste y los valores positivos implican menos contraste. ¡Esto es lo opuesto a lo que algunas personas podrían esperar! Un valor de 0 dejará la imagen sin cambios. 

El filtro de brillo, por otro lado, tiene límites mínimos y máximos de -255 y 255. El valor negativo en este caso implica un brillo mínimo y el valor positivo implica un brillo máximo.

Obtenemos el nombre de archivo de la ruta del archivo usando la función basename() y luego guardamos la imagen usando la función imagejpeg().

El objetivo de este tutorial era familiarizarte con la biblioteca de GD en PHP y aprender a usar todas estas funciones para hacerte la vida más fácil.  Puedes usar los ejemplos al final del tutorial como guía para escribir sus propios scripts de manipulación de imágenes. Por ejemplo, puedes cambiar el tamaño de una imagen solo si es más ancha que un límite dado al determinar su ancho usando la función imagesx ().

Todas estas funciones abren muchas posibilidades para facilitar la manipulación de la imagen y ahorrarle mucho tiempo al final. Si tienes alguna pregunta relacionada con este tutorial, házmelo saber en los comentarios.

 

Deja un comentario

Información básica sobre protección de datos Ver más

  • Responsable: Ingenio Hosting.
  • Finalidad:  Moderar los comentarios.
  • Legitimación:  Por consentimiento del interesado.
  • Destinatarios y encargados de tratamiento:  No se ceden o comunican datos a terceros para prestar este servicio.
  • Derechos: Acceder, rectificar y suprimir los datos.
  • Información Adicional: Puede consultar la información detallada en la Política de Privacidad.