Librería PHP de alto nivel para manipulación de imágenes, que puede trabajar tanto con la Librería GD o Imagick. Ejemplos de uso, para upload y manipulación de imágenes.
En este artículo vamos a explicar una de las librerías más útiles para trabajar con imágenes en aplicaciones PHP. Veremos algunos ejemplos prácticos sobre casos de uso habituales, como el upload de imágenes o su manipulación para la creación de thumbnails.
Básicamente es una librería que nos ofrece un API completo para hacer diversos tipos de manipulaciones sobre archivos gráficos, cambios de dimensiones, zoom, rotación, marcas de agua, aplicación de filtros con efectos diversos, optimización de los archivos, etc.
Se trata de una opción versátil, ya que es capaz de trabajar con las dos librerías de manipulación de imágenes disponibles en PHP, la Librería GD o Imagick, con lo que puede funcionar en la mayoría de entornos. La ventaja de trabajar con Intervention Image es que disponemos de una interfaz común y sencilla, de más alto nivel, que nos permite ser más productivos, ya que ahorra lidiar con las complejidades de las librerías y además nos ofrece métodos de realizar de manera expresiva y con menos código todo tipo de acciones que podemos necesitar en las aplicaciones.
En este artículo te vamos a explicar cómo usar la librería para trabajo con imágenes en PHP, pero también puedes consultar su documentación en la página de Intervention Image.
Instalación de Intervention Image
Podremos usar Intervention Image en PHP 5.4 o superior. Además requiere la extensión de PHP Fileinfo (es común que esté montada en cualquier servidor compatible con PHP) y alguna de las dos librerías de imágenes que soporta PHP de manera nativa: GD Library 2.0 o superior, o bien Imagick PHP versión 6.5.7 en adelante.
La manera más cómoda de integrar la librería Intervention Image en un proyecto PHP es vía Composer. Esto lo conseguimos con el comando:
php composer.phar require intervention/image
Una vez tienes instalado Intervention Image en tu proyecto, ya solo tienes que usar el autoload de clases de composer, para que el la librería esté disponible en el código de tu aplicación.
require 'vendor/autoload.php';
Ejemplo rápido con Intervention Image
Vamos a ver un primer ejemplo sencillo de uso de la librería, para dar nuestros primeros pasos. A partir de una imagen que hay previamente en nuestro sistema de archivos, crearemos un thumbnail y lo guardaremos con otro nombre de archivo.
// Autoload de composer
require 'vendor/autoload.php';
// Declaramos que vamos a usar la librería, a través de su namespace
use Intervention\Image\ImageManager;
// Creamos una instancia del manager de imágenes a través de la clase ImageManager
// En este caso estamos usando la extensión de PHP Imagick
$intervention = new ImageManager(array('driver' => 'imagick'));
// Creamos una imagen a partir de un archivo ya existente
$image = $intervention->make('images/img1.jpg');
// Redimensionamos esta imagen
$image->resize(500, 400);
// guardamos la imagen en el sistema de archivos, con otro nombre
$image->save('images/img-thumbnail1.jpg', 60);
Este código podría simplificarse un poco a partir de la concatenación de métodos sobre la imagen, resumiendo los tres últimos pasos en una sola línea de código
$intervention->make('images/img1.jpg')->resize(500, 400)->save('images/img-thumbnail.jpg', 60);
En este caso hemos hecho una única transformación sobre la imagen, un cambio de dimensiones, pero si concatenamos varias llamadas a métodos diversos sobre la librería, podremos hacer diversos efectos y transformaciones de una manera sencilla y con realmente poco código.
Como has visto, el método resize() es útil cuando sabemos qué dimensiones queremos para la imagen resultante. Sin embargo, si la proporción de dimensiones no es la de la imagen original, se deformará, estirándose o encogiéndose, lo que la dejará un poco estropeada. Podríamos calcular por nosotros mismos las dimensiones de destino que queremos, para que se guarden las proporciones, pero existe un par de métodos muy útiles para que este trabajo se realice automáticamente.
$imagen = $intervention->make('images/img1.jpg');
$imagen->widen(500)->save('images/img-thumbnail500.jpg', 60);
Esto creará una versión de la imagen con 500 píxeles de ancho y con la altura libre, de tal modo que se ajustará a la altura necesaria para que la imagen mantenga las proporciones. De manera similar al método widen() existe un método llamado heighten() que recibe la dimensión en la vertical, redimensionando con las mismas proporciones y esa altura fija.
Usar la librería GD o Imagick
Como se había mencionado, Intervention Image es capaz de trabajar con las dos librerías de imágenes disponibles en PHP: GD Library o Imagick PHP. Las dos librerías son válidas, aunque es mucho más recomendable usar Imagick por diversos motivos:
- Imagick PHP ofrece mayor rendimiento
- Imagick permite trabajar con ficheros mayores
- GD Library tiene algunas limitaciones, por lo que algunos métodos puntuales de Intervention Image podrían no funcionar.
El asunto es que no todos los servidores de PHP soportan Imagick para la manipulación de imágenes, mientras que la librería GD es una extensión bastante más común. Sea como sea, es algo que tiene que ver con tu servidor y que depende al administrador configurar o no. Desde el punto de vista de la programación, si quieres usar la librería GD simplemente tienes que instanciar el método de instanciación de ImageManager indicando que el driver es "gd".
$intervention = new ImageManager(array('driver' => 'gd'));
Para no tener problemas con imágenes que vienen directamente de cámaras digitales modernas, que suelen tener pesos altos, en torno de 5 MB o más, tenemos que usar preferentemente la librería Imagick, indicando ese valor en el correspondiente driver.
$intervention = new ImageManager(array('driver' => 'imagick'));
Es la única diferencia que tendremos en el código de nuestra aplicación. El resto del API de Intervention Image es común para ambos drivers. Por ello, sería una buena idea crear una variable de entorno fácilmente, para almacenar el driver adecuado para nuestro servidor. Así no tendremos que cambiar la implementación de nuestro código al cambiar de un servidor a otro con soporte a una u otra librería.
Alternativa de creación de imágenes con métodos estáticos
Por si te sirve de ayuda, existen alternativas de métodos estáticos para construir las imágenes. Estos métodos dispensan la instanciación del objeto de clase ImageManager y a veces crea un código que nos pueda resultar más claro.
Solo tienes que usar una clase diferente del namespace y crear las imágenes de una manera distinta.
use Intervention\Image\ImageManagerStatic as Image;
Image::configure(array('driver' => 'imagick'));
$img = Image::make($_FILES['file']['tmp_name']);
A partir de aquí, todas las tareas de manipulación de la imagen se realizan de la misma manera.
Obtener información de una imagen
Con esta librería podemos fácilmente obtener datos sobre la imágen con la que estamos trabajando. Para ello usamos diversos métodos útiles. Vamos a verlo con un ejemplo.
$imagen = $intervention->make('images/img1.jpg');
$tamano = $imagen->filesize();
$anchura = $imagen->width();
$altura = $imagen->height();
echo "Peso: $tamano, ancho: $anchura, alto: $altura";
Esto nos informará del tamaño en bytes de la imagen, además de la altura en píxeles y la anchura en píxeles.
Efectos y filtros sobre imágenes
Algo muy interesante, que nos puede abrir las puertas de diversas ideas de aplicaciones, es la posibilidad de aplicar efectos a las imágenes. Hay métodos sencillos para aplicar efectos diversos fácilmente. Encontrarás filtros como un enfocado de la imagen, convertir en blanco y negro, cambiar la luminosidad, contraste, etc.
El enfocado de la imagen es muy útil para aumentar la calidad de la imagen, después de crear un thumbnail, para mejorar su nitidez.
$imagen->widen(350)->sharpen()->save('images/enfocada350.jpg');
El resultado de esta imagen, con su versión sin enfocar, para que se pueda apreciar la diferencia, se puede ver a continuación.
También podemos crear nuestros propios filtros personalizados a base de crear secuencias de transformaciones que podamos desear. Estos filtros se crean con clases creadas por nosotros mismos, que deben implementar la interface "FilterInterface". Consulta la documentación del método filter() de InterventionImage para más información.
Upload de imágenes y creación de thumbnails en PHP
La librería Intervention Image no permite hace un upload de una imagen desde el ordenador del cliente, ya que esta funcionalidad pertenece realmente a PHP. Pero una vez realizada la carga de la imagen, podemos perfectamente hacer las transformaciones que deseemos, creando las copias de las imágenes que sean necesarias en el servidor, con el tamaño original, dimensiones específicas, thumbnails, etc.
Veamos un sencillo ejemplo de página que realiza un upload de imágenes, para tener una noción sobre cómo se realizaría este paso. Realmente veremos que las acciones son prácticamente las mismas que hemos conocido, con la salvedad que la imagen la estamos trayendo de una localización diferente.
Este listado corresponde con el archivo upload.php, que se llama a sí mismo para poder realizar el upload de la imagen seleccionada en el formulario.
<?php
require 'vendor/autoload.php';
use Intervention\Image\ImageManager;
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Upload de imagen con PHP y manipulación con Intervention Image</title>
</head>
<body>
<?php
if(!$_FILES) {
?>
<form action="upload.php" method="post" enctype="multipart/form-data">
Imagen: <input type="file" name="imagen_formulario">
<input type="submit" value="Subir imagen">
</form>
<?php
} else {
$intervention = new ImageManager(array('driver' => 'imagick'));
$img = $intervention->make($_FILES['imagen_formulario']['tmp_name']);
$img->fit(350, 150)->sharpen(15)->save('images/upload.jpg', 75);
echo 'Imagen subida';
}
?>
</body>
</html>
Hay varias consideraciones que se deberían realizar sobre este ejemplo:
- La primera corresponde a la seguridad. En este ejemplo no estamos teniendo en cuenta ningún factor de seguridad, como comprobar que la imagen es realmente un archivo gráfico, que tiene el peso adecuado, etc.
- Estamos asumiendo que el formato de la imagen subido es jpg.
- La imagen siempre se guarda con el nombre upload.jpg dentro de la carpeta images, pero si quisieras guardarla con el nombre original podrías usarlo desde $_FILES['imagen_formulario']['name'])
Ya en lo relativo a la librería intervention, habría que señalar un par de novedades que no habíamos tratado antes en este artículo.
- Primero decir que el método fit() permite redimensionar una imagen de manera proporcional, indicando valores de anchura y altura. La imagen se transformará con una combinación entre redimensión y recorte, de manera que se ajuste a esas dimensiones sin deformarse. Es un método realmente útil que nos quitará mucho trabajo al hacer las distintas versiones de imágenes a tamaños fijos.
- El método sharpen() recibe un parámetro, con un valor entre 0 y 100, equivalente a la cantidad deseada de enfoque. 10 es el valor predeterminado.
- El método save() recibe opcionalmente un valor de calidad, que aplicará al guardar la foto como jpg. El valor predeterminado es 90 y en png no se puede aplicar calidad, ya que el formato no aplica ese concepto al no tener pérdida.
Conclusión
Hemos conocido una librería para manipulación de imágenes en PHP, de alto nivel, que recomendamos para cualquier tipo de aplicación donde tengas que trabajar con imágenes de cualquier tipo.
Esta librería te permite de una manera cómoda hacer muchos tipos de transformaciones y filtros, que puedes extender hasta donde tu imaginación lo permita. Funciona muy bien y tiene un gran rendimiento cuando la usamos con el driver Imagick PHP. Además, si trabajas con Laravel, tiene su package específico para poder usarla cómodamente desde el mismo framework.
Con los ejemplos que hemos presentado en este artículo estamos seguros que podrás implementar tus propias soluciones de tratamiento de imágenes con PHP. Puedes encontrar toda la información y documentación de la librería en http://image.intervention.io/
Miguel Angel Alvarez
Fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Com...