norfipc.com
Códigos   Mapa del sitio   Informatica

Códigos para crear imágenes y gráficos con PHP


Actualizado: 22 de noviembre del 2022
Por: Norfi Carrodeguas
Ejemplos prácticos de imágenes creadas solo con código para una dirección de correo electrónico, captchas para formularios que cambien los números de forma aleatoria y gráficas de barras y circulares, para insertar en las páginas web usando la librería GD de PHP. Códigos para copiar y experimentar.
Códigos para crear imágenes y gráficos con PHP
El lenguaje de programación PHP, con el que se escriben muchas de las páginas de internet, por ejemplo WordPress y gran parte de este sitio, puede ser usado para crear imágenes con solo una porción de código.
Para eso se usan varias funciones que incluyen este lenguaje y una librería llamada GD incluida en las últimas versiones.
Estas imágenes tienen muchos usos en la práctica.


Usos prácticos de las imágenes creadas con PHP


Aunque poco conocido por los aficionados, es una alternativa y una excelente opción en muchos casos, por ejemplo:
1- Crear las imágenes de las captchas usadas para la validación en los formularios que muestran una serie de números aleatorios cada vez que se recarga la imagen.
2- Crear imágenes con texto de forma dinámica, usado para mostrar la dirección IP del navegante que accede a un sitio web.
3- Escribir en una imagen una dirección de correo electrónico, que al no tratarse de texto no puede ser escaneada por los robots de los spammer y si la ven perfectamente las personas.
4- Escribir gráficos en las páginas con los valores obtenidos de forma dinámica por una función y escritos por PHP.
Existen muchos otros usos prácticos, solo mencionamos los más populares de los que compartimos ejemplos en este artículo cuyo código puede ser copiado y modificado de acuerdo a la necesidad y el interés de cada uno.
Muchos de los códigos tienen líneas con comentarios para ayudar a configurar los parámetros.


Ejemplos de imágenes creadas con PHP, códigos para copiar


Son varias las funciones disponibles en PHP para crear las imágenes y configurar la forma en que se muestran.
Las elementales y que se usan en los ejemplos más abajo son las siguientes:
imagecreate - Crea una nueva imagen basada en paleta
imagecreatetruecolor - Crea una nueva imagen de color verdadero
imageline - Dibuja una línea
imagestring - Dibuja una cadena de texto horizontalmente
imagecolorallocate - Asigna un color para una imagen
imagefill - Rellena
imagejpeg - Exporta la JPEG imagen al navegador o a un fichero
imagepng - Imprime una imagen PNG al navegador o a un archivo
imagefttext - Escribe texto en la imagen usando fuentes mediante FreeType
imagedestroy - Destruye una imagen


Crear una imagen con una dirección de correo electrónico con PHP

En el primer ejemplo mostramos como crear una imagen que muestre solo una línea de texto, por ejemplo en este caso una dirección de correo electrónico.
Imagen creada con PHP para mostrar una dirección de correo electrónico
Para eso usamos el siguiente código en un archivo auxiliar y lo vinculamos a una página usando la etiqueta <img src="ruta-al-archivo.php">
<?php
header("Content-Type: image/png");
$im = @imagecreate(160, 30);
$color_fondo = imagecolorallocate($im, 0, 153, 255);
$color_texto = imagecolorallocate($im, 255, 255, 255);
imagestring($im, 10, 5, 5, "info@norfipc.com", $color_texto);
imagepng($im);
imagedestroy($im);
?>
Los parámetros que se pueden ajustar son los siguientes:
@imagecreate(160, 30) - Ancho y alto de la imagen en pixeles
$color_fondo - Color del fondo expresado en sus tres valores RGB
$color_texto - Color del texto expresado en sus tres valores RGB
imagestring() - 3 valores con la distancia del texto al borde en pixeles y el texto a representar.
Los valores RGB de un color se pueden obtener de un programa editor de imágenes.
Todas las imágenes a continuación usan parámetros básicos similares que se pueden modificar.


Crear imagen en PHP para mostrar la dirección IP

Otro ejemplo de una imagen, que en este caso muestra la dirección IP con la que accedes a esta página.
Para obtener la IP se usa la función $_SERVER[REMOTE_ADDR]
Imagen creada con PHP para mostrar la dirección IP
Usa el siguiente código:
<?php
$img_number = imagecreate(325,25);
$backcolor = imagecolorallocate($img_number,0,153,255);
$textcolor = imagecolorallocate($img_number,255,255,255);
imagefill($img_number,0,0,$backcolor);
$number = " Tu dirección IP es: $_SERVER[REMOTE_ADDR]";
Imagestring($img_number,10,5,5,$number,$textcolor);
header("Content-type: image/jpeg");
imagejpeg($img_number);
?>    


Crear imágenes con PHP usando fuentes adicionales

Las imágenes anteriores tienen la restricción de que el tamaño de la fuente es limitado.
Para poder crear imágenes con diferentes estilo del texto, además en las que se pueda escalar el tamaño de la fuente y de la misma imagen, es necesario usar una fuente adicional, alojada en el servidor e indicar su ruta en el código.
También es necesario usar la funcion "imagecreatetruecolor()", para asegurarnos una imagen de calidad.
A continuación un ejemplo.
Imagen creada con PHP con fuente adicional
Usa el siguiente código y guíate por los comentarios para personalizarla:
<?php
// Crear una imagen de 500x300
$im = imagecreatetruecolor(500, 300);
//Colores del fondo y del texto
$rojo = imagecolorallocate($im, 201, 101, 115);
$crema = imagecolorallocate($im, 250, 250, 219);
imagefilledrectangle($im, 0, 0, 500, 299, $crema);
// Ruta del archivo de fuente TTF
$fuente = realpath('../../fonts/Quixley.ttf');
// Caja circundante para el texto
$bbox = imagettfbbox(50, 0, $fuente, '  Texto escrito por PHP' );
// Coordenadas para X e Y
$x = $bbox[0] + (imagesx($im) / 2) - ($bbox[4] / 2) - 25;
$y = $bbox[1] + (imagesy($im) / 2) - ($bbox[5] / 2) - 5;
// Escribirlo
imagettftext($im, 50, 0, $x, $y, $rojo, $fuente, '  Texto escrito por PHP');
// Imprimir al navegador
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>   

Otro ejemplo similar, pero en este caso se le agrega sombra al texto.
Imagen creada con PHP con texto con sombra
Código:
<?php
// Establecer el tipo de contenido
header('Content-Type: image/png');
// Crear la imagen
$im = imagecreatetruecolor(500, 100);
// Crear algunos colores
$blanco = imagecolorallocate($im, 255, 255, 255);
$gris = imagecolorallocate($im, 170, 170, 170);
$rojo = imagecolorallocate($im, 201, 101, 115);
imagefilledrectangle($im, 0, 0, 499, 99, $blanco);
// El texto a dibujar
$texto = 'Texto con sombra';
// Reemplace la ruta por la de su propia fuente
$fuente = realpath('../../fonts/Quixley.ttf');
// Añadir algo de sombra al texto
imagettftext($im, 50, 0, 43, 63, $gris, $fuente, $texto);
// Añadir el texto
imagettftext($im, 50, 0, 40, 60, $rojo, $fuente, $texto);
// Usar imagepng() resultará en un texto más claro comparado con imagejpeg()
imagepng($im);
imagedestroy($im);
?>    


Crear una imagen con PHP que muestre caracteres aleatorios

Imagen creada de forma similar a las anteriores, pero contiene una función para generar una combinación de 6 caracteres (letras y números), de forma aleatoria.
También es un ejemplo de cómo crear dos bloques de texto con diferente estilo.
(No valida en PHP 8)
Imagen creada con PHP que muestra caracteres aleatorios
Código:
<?php
$string="";
$str="";
// Crear una imagen de 500x300
$im = imagecreatetruecolor(500, 240);
$rojo = imagecolorallocate($im, 201, 101, 115);
$crema = imagecolorallocate($im, 250, 250, 219);
$negro = imagecolorallocate($im, 80, 80, 80);
// Establecer el fondo a crema
imagefilledrectangle($im, 0, 0, 499, 239, $crema);
// Ruta de nuestro archivo de fuente
$fuente = realpath('../../fonts/Quixley.ttf');
$string = "abcdefghijklmnopqrstuvwxyz0123456789"; 
for($i=0;$i<6;$i++){ 
    $pos = rand(0,35); 
    $str .= $string{$pos}; 
}
// Escribirlo
imagettftext($im, 22, 0, 50, 40, $negro, $fuente, 'Letras y números aleatorios escritos con PHP');
imagettftext($im, 100, 0, 100, 180, $rojo, $fuente, $str);
//imagettftext($im, fontsize, 0, left, top, $colortexto, $fuente, $str);
// Imprimir al navegador
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
?>  
Aclaración
Las páginas de este sitio se sirven desde la cache del CDN del servicio de Cloudllare, por lo que al recargar esta página se muestra la misma combinación de caracteres en el ejemplo anterior.
Para comprobar que su funcionamiento es correcto, carga la siguiente página que se sirve directamente desde el servidor: Como impedir que el navegador cargue imágenes guardadas en su cache

Crear una captcha para un formulario que muestre números aleatorios con PHP

Todas las imágenes que se muestran en los formularios de distintos servicios de internet, para verificar que el usuario es una persona y no una máquina o un robot, son creadas con PHP como la siguiente.
Al cargar dicha imagen desde la página donde está situado el formulario, se inicia la función session_start(); que genera una combinación diferente.
Una imagen de ejemplo se muestra a continuación.
Imagen para un captcha creada con PHP para un formulario
<?php 
header("Content-type: image/png"); 
$im = @imagecreate(110, 32);
$color_fondo = imagecolorallocate($im, 102,102,153);
$color_texto = imagecolorallocate($im, 255,255,255);
session_start(); 
  $digit = '';
  for($x = 15; $x <= 95; $x += 20) {
    $digit .= ($num = rand(0, 9));
    imagechar($im, rand(3, 5), $x, rand(2, 14), $num, $color_texto);}  
imagepng($im);
imagedestroy($im);
$_SESSION['img_number'] = $digit;
?>     
Lee en otro artículo el código necesario para el formulario: Como proteger los formularios y evitar la inyección de código SQL en PHP

Imagen para una captcha con líneas y combinación de colores

La siguiente imagen cumple la misma función que el anterior, pero se usan líneas y textura de colores para hacer más difícil su cracking por los bots.
Imagen para un captcha creada con PHP con números y líneas
Usa el siguiente código:
Por ser mas compleja, el código incluye varios comentarios (líneas que comienzan con //).
<?PHP
  $image = @imagecreatetruecolor(120, 30) or die("Cannot Initialize new GD image stream");
  // set background and allocate drawing colours
  $background = imagecolorallocate($image, 0x66, 0x99, 0x66);
  imagefill($image, 0, 0, $background);
  $linecolor = imagecolorallocate($image, 0x99, 0xCC, 0x99);
  $textcolor1 = imagecolorallocate($image, 0x00, 0x00, 0x00);
  $textcolor2 = imagecolorallocate($image, 0xFF, 0xFF, 0xFF);
  // draw random lines on canvas
  for($i=0; $i < 6; $i++) {
    imagesetthickness($image, rand(1,3));
    imageline($image, 0, rand(0,30), 120, rand(0,30) , $linecolor);
  }
  session_start();
  // add random digits to canvas using random black/white colour
  $digit = '';
  for($x = 15; $x <= 95; $x += 20) {
    $textcolor = (rand() % 2) ? $textcolor1 : $textcolor2;
    $digit .= ($num = rand(0, 9));
    imagechar($image, rand(3, 5), $x, rand(2, 14), $num, $textcolor);
  }
  // record digits in session variable
  $_SESSION['digit'] = $digit;
  // display image and clean up
  header('Content-type: image/png');
  imagepng($image);
  imagedestroy($image);
?>    



Imagen para una captcha con PHP que usa una fuente auxiliar

En este caso se incluyen líneas para hacer más difícil de escanear los números en la imagen.
Se usa una fuente externa que se carga de nuestro servidor web (Quixley.ttf), para hacer más legibles y vistosos los caracteres en la imagen.
Imagen para un captcha creada con PHP y una fuente auxiliar (No valida en PHP 8).
Imagen para un captcha creada con PHP y una fuente auxiliar
Usa el siguiente código.
<?php 
// Font directory + font name 
$font = realpath('../../fonts/Quixley.ttf'); 
// Total number of lines 
$lineCount = 40; 
// Size of the font 
$fontSize = 40; 
// Height of the image 
$height = 50; 
// Width of the image 
$width = 150; 
$img_handle = imagecreate ($width, $height) or die ("Cannot Create image"); 
// Set the Background Color RGB 
$backColor = imagecolorallocate($img_handle, 255, 255, 255); 
// Set the Line Color RGB 
$lineColor = imagecolorallocate($img_handle, 175, 238, 238); 
// Set the Text Color RGB 
$txtColor = imagecolorallocate($img_handle, 135, 206, 235); 
$string = "abcdefghijklmnopqrstuvwxyz0123456789"; 
for($i=0;$i<5;$i++){ 
    $pos = rand(0,36); 
    $str .= $string{$pos}; 
} 
$textbox = imagettfbbox($fontSize, 0, $font, $str) or die('Error in imagettfbbox function'); 
$x = ($width - $textbox[4])/2; 
$y = ($height - $textbox[5])/2; 
imagettftext($img_handle, $fontSize, 0, $x, $y, $txtColor, $font , $str) or die('Error in imagettftext function'); 
for($i=0;$i<$lineCount;$i++){ 
    $x1 = rand(0,$width);$x2 = rand(0,$width); 
    $y1 = rand(0,$width);$y2 = rand(0,$width); 
    imageline($img_handle,$x1,$y1,$x2,$y2,$lineColor); 
} 
header('Content-Type: image/jpeg'); 
imagejpeg($img_handle,NULL,100); 
imagedestroy($img_handle); 
session_start(); 
$_SESSION['img_number'] = $str; 
?>     

Crear gráficos con PHP


No solo se puede representar texto y números en una imagen, sino también los elementos de un gráfico.
Imagen de un gráfico circular creado con PHP.
Imagen de un gráfico circular creado con PHP
Imagen de un gráfico de barras creado con PHP.
Imagen de un gráfico de barras creado con PHP
Código de los gráficos: http://www.w3lessons.com/

Errores al crear imágenes con gd2 en PHP


En algunas instalaciones de PHP en un servidor local en la computadora, puede que no esté activada la extensión para poder usar la librería GD.
Es ese caso las imágenes no se pueden crear.
Es necesario editar el archivo "php.ini" y descomentar (quitar el punto y coma) al comienzo de la línea siguiente:
extension=php_gd2.dll
En versiones más recientes de HP es: extension=php_gd.dll o simplemente: extension=gd
Guarda los cambios y reinicia Apache.
Si no da resultado lo anterior, indica la ruta completa al archivo php_gd2.dll (en Windows) de la siguiente forma.
También asegúrate de descomentar la directiva "extension_dir".
extension=C:\xampp\php\ext\php_gd2.dll
extension_dir = "ext"
Lee más información sobre como configurar PHP: Como instalar y configurar el servidor web Apache en Windows

Páginas relacionadas



Comparta esta página
Facebook
Twitter

Sígueme en las redes sociales


Norfipc en Facebook Norfipc en Twitter Canales RSS con las últimas publicaciones

 
Inicio | Mapa del sitio | Buscar | Sobre mí