Programación en PHP/Avanzado/Graficos GD

De Wikilibros, la colección de libros de texto de contenido libre.

Pendiente.. Escribir breve intro de que es GD.

Un nuevo concepto: Encabezados[editar]

Hasta ahora le hemos pedido a PHP que envíe texto al navegador, pero cuando trabajamos con imágenes, es necesario decirle al servidor web qué tipo de datos estamos enviando, para que a su vez, se lo notifique a los navegadores.

Para ello, utilizamos la función header.

<?php
header('Content-type: image/png');
?>

Esta función nos permite enviar mucha información al navegador; pero en esta ocasión, sólo nos interesa uno de los parámetros posibles: El parámetro "Content-type".

En el ejemplo anterior Content-type, o Tipo de contenido, nos permite decirle al navegador que la serie de datos que estamos enviando es una imágen y que es de tipo 'png'.

Manipulación de imágenes[editar]

Para cualquier imágen, vamos a requerir los siguientes bloques de código:

  1. Crear / Abrir
  2. Dibujar / Manipular / Escribir
  3. Enviar encabezado
  4. Desplegar imágen
  5. Destruir imágen

Ya hablamos del encabezado, asi que ahora veremos cómo interactuar con la imágen.

Abrir, crear, desplegar y destruir[editar]

Para crear una imágen, se debe llamar a imagecreatetruecolor o a imagecreate.

Siempre que se manejen imágenes, es importante destruirlas al finalizar. Esto se logra con la función imagedestroy.

<?php

$image = imagecreatetruecolor($width, $height);
imagealphablending($image, true);

header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>

En el ejemplo anterior, hay otra función a la cual prestarle atención: imagePNG. Esta es la función responsable de desplegar nuestra imágen. Si se desea desplegar en otro formato de imágen (que no sea PNG); pueden utilizarse, por ejemplo, las funciones imageGIF, imageWBMP, imageJPEG, etcétera.

Para determinar los tipos de imágenes que soporta su sistema, puede llamar a la función imagetypes.

Abrir una imágen ya existente puede presentar un inconveniente: la forma de abrirla depende del tipo de imágen del que se trata (por ejemplo: imageCreateFromGIF, imageCreateFromJPEG o imageCreateFromPNG). Por eso, es útil tener una función que abra cualquier tipo de archivo.

El siguiente código, basado en un comentario en la página de PHP, trata de determinar el tipo de archivo del que se trata y utiliza la función correspondiente.

Se basa en la función getimagesize, la cual regresa un arreglo del cual el elemento con índice 2 regresa un código dependiendo del tipo de archivo. En caso de existir la función que abre ese tipo específico de archivo, lo abre. De lo contrario termina la ejecución.

<?php
    // Esta funcion trata de determinar el tipo de archivo de imagen
    // y lo abre
    function imageCreateFromFile($filename)
    {
        static $image_creators;

        if (!isset($image_creators)) {
            $image_creators = array(
            1 => "imagecreatefromgif",
            2 => "imagecreatefromjpeg",
            3 => "imagecreatefrompng",
            6 => "imagecreatefromwbmp",
            16 => "imagecreatefromxbm"
            );
        }

        $image_size = getimagesize($filename);
        if (is_array($image_size)) {
            $file_type = $image_size[2];
            if (isset($image_creators[$file_type])) {
                $image_creator = $image_creators[$file_type];
                if (function_exists($image_creator)) {
                    return $image_creator($filename);
                } else {
                    die("imagecreatefrom: Function $image_creator doesn't exist!");
                }
            } else {
                die("imagecreatefrom: Image type is not supported!");
            }
        } else {
            die("imagecreatefrom: Not an array while calling getimagesize()!");
        }
    }
?>

Colores y canales alfa[editar]

En GD, los colores suelen estar representados en el modelo de color RGB (por las siglas en inglés Red, Green, Blue; es decir Rojo, Verde, Azul).

Sin embargo, hay un cuarto componente cuando elegimos un color (por ejemplo, con imagecreatetruecolor): 'alfa'. El valor de alfa también es conocido como transparencia. En donde 255 es completamente transparente, y 0 es totalmente opaco.

En el siguiente ejemplo, se asignan 2 colores. Uno se utiliza para rellenar el fondo de la imágen y el otro para escribir texto en la imágen.

<?php
$image = imagecreatetruecolor($width, $height);
imagealphablending($image, true);
$background = imagecolorallocatealpha($image,230,230,230,0);
$foreground = imagecolorallocatealpha($image,0,0,0,0);
imagefill($image, 0,0,$background);
imagestring($image, 5, 0.05*$width, 0.05*$height, $string, $foreground);

header('Content-type: image/
imagepng($image);
imagedestroy($image);
?>

La función imagealphablending establece el modo de mezcla de transparencia para una imágen. Esto es necesario si queremos que se mezclen los valores de transparencia en la imágen.

Líneas, círculos, rectángulos[editar]

Hay muchas funciones para dibujo, como lo son: imageFill, imageFilledRectangle, imageRectangle, imageLine, imageArc, etc..

Texto[editar]

<?php
$image = imageCreate($maxdimension,$maxdimension);
// elegimos colores..
$colorBG = imageColorAllocate($image, 192, 192, 192);
$colorTXT = imageColorAllocate($image, 0, 0, 255);
imageString($image, 5, 10, 40, "Imagen no encontrada", $colorTXT);
// creamos imagen entrelazada
imageInterlace($image, 1);
header("Content-type: image/png"); // Tipo de contenido
imagePNG($image);
imagedestroy($image);
exit();
?>

Tamaño de fuentes[editar]

Fuentes no predeterminadas[editar]

<?php
$string = "Hola, mundo!"; // Creamos una cadena
$stringlength = strlen($string); // Obtenemos su longitud
$font = imageloadfont("caveman.gdf");
$width = 1.1 * $stringlength * imagefontwidth($font);
$height = 1.1 * imagefontheight($font);
$image = imagecreatetruecolor($width, $height);
imagealphablending($image, true);
$background = imagecolorallocatealpha($image,230,230,230,0);
$foreground = imagecolorallocatealpha($image,0,0,0,0);
imagefill($image, 0,0,$background);
imagestring($image, $font, 0.05*$width, 0.05*$height, $string, $foreground);

header('Content-type: image/png');
imagepng($image);
imagedestroy($image);
?>

Enlaces externos[editar]