miércoles, 19 de diciembre de 2012

Generar imágenes al vuelo con PHP

En esta ocasión vamos a ver un ejemplo muy simple para la generación de una imagen con formato PNG mediante algunas de las funciones que ofrece la biblioteca GD2.

Hemos utilizado imagepng() para generar al vuelo el archivo png, es decir, enviamos directamente la imagen al navegador, pero podríamos haber guardado la imagen en el disco simplemente añadiendo un segundo parámetro con su nombre.

//definimos el ancho y alto
$width = 200;
$height = 200;

//Creamos un lienzo sobre el que trabajar
$img = imagecreatetruecolor($width, $height) or die('No se pudo iniciar el flujo de la imagen');

//colores
$blanco = imagecolorallocate($img, 255, 255, 255);
$otro = imagecolorallocate($img, 130, 205, 242);
$azul = imagecolorallocate($img, 0, 0, 64);

//dibujar la imagen
imagefill($img, 0, 0, $azul);
imageline($img, 0, 0, $width, $height, $blanco);
imagefilledrectangle($img, 0, 0, 100, 100, $otro);
imagestring($img, 4, 40, 145, 'Un texto', $blanco);
imagestring($img, 4, 110, 50,  'Otro Texto', $blanco);

//ofrecer el resultado
header('Content-type: image/png');
imagepng($img);

//liberar recursos
imagedestroy($img);

Ahora vamos a escribir un texto centrado sobre una imagen jpg ya existente, para ello necesitamos obtener las dimensiones de la imagen y también del texto para poder ubicarlo correctamente.

$texto = 'un texto centrado';
$tamano_texto = 20;
$fuente = $_SERVER['DOCUMENT_ROOT'] . '/site/arial.ttf';

$img = imagecreatefromjpeg('iron-maiden.jpg');
$ancho = imagesx($img);
$alto = imagesy($img);

$caja_texto = imagettfbbox($tamano_texto, 0, $fuente, $texto);

$ancho_texto = $caja_texto[2] - $caja_texto[0];
$alto_texto = abs($caja_texto[7] - $caja_texto[1]);

$posicion_texto_x = ($ancho/2.0) - ($ancho_texto/2.0);
$posicion_texto_y = ($alto/2.0) - ($alto_texto/2.0);

$blanco = imagecolorallocate($img, 255, 255, 255);

imagettftext($img, $tamano_texto, 0, $posicion_texto_x, $posicion_texto_y, $blanco, $fuente, $texto);

header('Content-type: image/jpeg');
imagejpeg($img);

imagedestroy($img);