miércoles, 14 de noviembre de 2007

Thumbnails (miniaturas) de imágenes con Php

Como hacer miniaturas de imágenes usando Php.

El lenguaje de programación Php, entre otras cosas, nos brinda la posibilidad de generar imágenes en varios formatos, entre los cuales están: PNG, GIF, JPG.

Las imágenes pueden ser creadas a partir de una imagen que ya existe o creando el archivo de imagen a partir de cero.

Estas operaciones las logra utilizan la biblioteca GD, que permite además de manipular imágenes, obtener información sobre las mismas.

Hablando un poco mas en concreto, php nos permite además de generar html, generar imagen, en ambos casos la salidad producida por php será interpretada por el navegador como un archivo .html o como un archivo de imagen, .gif, .jpg, .png, .tif etc.

Esto nos da la posibilidad de agregar al src del tag de una imagen un archivo php, por ejemplo:

<img
src="imagen.php" width="80" height="80">

Lo que nos mostraría en el navegador una imagen de 80x80 pixels, una imagen creada a partir de código php.

Hasta aca la idea, ahora lo que tendríamos que hacer es ponerle el código a nuestro archivo Php para que nos genere la imagen.

GENERANDO IMAGENES CON PHP

Como vamos a crear miniaturas de imágenes, tenemos que crear nuestras miniaturas a partir de imágenes que ya existen.


$filename = "original_default.jpg";
$lado_thumb = 80;

//determinando el tipo
header('Content-type: image/jpeg');

//crear Lienso de la imagen
$thumb = imagecreatetruecolor($lado_thumb,$lado_thumb);
$image = imagecreatefromjpeg($filename);

//conocer las dimensiones de la imagen original

$size = getimagesize($filename);

$ancho_inicial = $size[0];

$alto_inicial = $size[1];

//tomamos el lado más grande de la imagen para tener
una imagen cuadrada

$lado = $ancho_inicial>$alto_inicial ? $alto_inicial : $ancho_inicial;

//creamos la miniatura en base al original
imagecopyresampled($thumb, $image, 0, 0, 0, 0, $lado_thumb, $lado_thumb, $lado, $lado);

// Salida calidad 70%
imagejpeg($thumb, null, 70);

Con este código vamos a generar una miniatura de la imagen original, esta imagen es generada 'al vuelo', por lo que se genera en tiempo de ejecución de la página, y no la estamos guardando en el servidor.

Ya tenemos el código necesario para generar 1(una) miniatura, pero siempre de la misma imagen.


APROVECHANDO LA BASE DEL CÓDIGO

Haciendo algunos cambios podemos hacer más útil nuestro código, por ejemplo para generar miniaturas de distintas imágenes, y hasta de distintos tamaños.

nuestra llamada original a la pagina que genera las miniaturas era:

<img src="miniatura.php" width="80" height="80">

Pasando parametros por Querystring podemos hacer nuestro codigo mas util.

Vamos indicarle a nuestro archivo que nos genere la miniatura de una imagen determinada:


<
img src="miniatura.php?imagen=sol.jpg" width="80" height="80">

Ahora tenemos que modificar nuestro archivo php, el cambio es pequenio pero muy util.

Agregamos y modificamos las siguientes lineas


//modificamos la linea donde determinamos el nombre
del archivo
$filename = isset($_REQUEST["imagen"]) ? $_REQUEST["imagen"] : "original_default.jpg";


Indicando el tamaño de la imagen de salida

Ahora vamos a pasar los parámetros de la dimensión de la imagen de salida.


<
img src="miniatura.php?imagen=sol.jpg&ancho=80&alto=80">

y modificamos nuestro php para que nos genere una imagen de las medidas deseadas.

Practico no?

todo el codigo fina junto:


$filename = isset($_REQUEST["imagen"]) ? $_REQUEST["imagen"] : "original_default.jpg";

$ancho_thumb = isset($_REQUEST["ancho"]) ? $_REQUEST["ancho"] : 80;

$alto_thumb = isset($_REQUEST["alto"]) ? $_REQUEST["alto"] : 80;

//determinando el tipo
header('Content-type: image/jpeg');


//crear Lienso de la imagen
$thumb = imagecreatetruecolor($ancho_thumb, $alto_thumb);

$image = imagecreatefromjpeg($filename);

//conocer las dimensiones de la imagen original

$size = getimagesize($filename);

$ancho_inicial = $size[0];
$alto_inicial = $size[1];

//tomamos el lado mas grande de la imagen para tener una imagen cuadrada
$lado = $ancho_inicial>$alto_inicial ? $alto_inicial : $ancho_inicial;

//creamos la miniatura en base al original

imagecopyresampled($thumb, $image, 0, 0, 0, 0, $ancho_thumb, $alto_thumb, $lado, $lado);

// Salida calidad 70%
imagejpeg($thumb, null, 70);

Gerardo Benitez

No hay comentarios: