Generacion de imagenes desde php/recuperacion de imagenes desde base de datos

rargueso
02 de Diciembre del 2003
Varias personas me han enviado consultas relacionadas con el mismo tema, asi que desde aqui contesto a todos juntos:

Si nosotros vamos a crear o recuperar una imagen desde base de datos, lo primero que debemos tener en cuenta es que el archivo php en el cual vamos a generar dicha imagen deberemos tratarlo como una imagen.

¿Que implica esto?

Pues que no deberiamos mostrar nada mas que no sea la imagen.

Deberiamos mandar la cabecera correspondiente al mime de la imagen para engañar al navegador (si recuperamos la imagen de base de datos):

<?
include $_SERVER["DOCUMENT_ROOT"]."/administracion/lib/admin.inc.php";
mysql_con();
$sql="SELECT mime, imagen FROM productos WHERE id_producto='".$_GET["id"]."'";
$consulta=mysql_query($sql) or die(mysql_error());
$registro=mysql_fetch_array($consulta);
header("Content-Type: ".$registro["mime"]);
echo base64_decode($registro["imagen"]);
?>

En este ejemplo, saco los datos binarios y el mime de base de datos y construyo la imagen. Fijaros que la imagen que saco depende del id que le llegue al script. El campo mime es un varchar de 255 y el contenido de la imagen un blob, ambos tipos son campos de mysql. Todas las bases de datos tienen campos similares. Es importante guardar ademas de los datos binarios el tipo mime de la imagen puesto que es imprescindible para recuperarla luego. Los datos binarios, en mysql, debemos guardarlos codificados en base64 para evitar errores en el insert.

¿Y como muestro esa imagen?

Facil, facil.

<img src="imagen.php?id=3">
<img src="imagen.php?id=1">
<img src="imagen.php?id=2">

Ahi tenemos 3 imagenes diferentes generadas con el mismo script.

Si la imagen la creamos nosotros seguimos el mismo procedimiento. La imagen en un archivo aparte sola.

<img src="imagen.php?anyo=2004&mes=enero">

En este ejemplo le estoy pasando a la imagen dos variables por la url (tambien es metodo get) que supongamos necesarias para la creacion de la imagen.

Espero que os sirva. Un saludo a todos.