PDA

Ver la Versión Completa : Tratamiento de imagen BLOB y redimensionado.


papulo
12-09-2008, 17:42:47
Hola gente,

hoy traigo un nuevo problema, bastante interesante creo yo, relacionado con firebird, imagenes en campos BLOB y el tratarlas antes de mostrarlas.

Básicamente tengo este código que funciona a la perfección:

<?php
//imagen.php
/* Mandando las cabeceras de la imagen */
//Header("Content-type: image/jpg");

/* Verificando la existencia de la imagen */
$query=("SELECT LAIMAGEN
FROM PICTURES_JPG
WHERE p.PICTURE_NAME='M010001'");

$connection = ibase_pconnect ('1.1.1.1:picturesdb', 'sysdba', 'masterkey')or die("Couldn't connect to database!");

$sql = $query; //Insertamos la consulta que queremos realizar

$consulta = ibase_query($connection, $sql);
$data = ibase_fetch_object ($consulta);

ibase_blob_echo($data->PICTURE);

Que funciona chachi de la muerte.

La cuestión es la siguiente, estoy haciendo una API que permite cargar esas imágenes remotamente, pero "pesan" un poco y me gustaría poder rebajarles el tamaño, amén de redimensionarlas de forma proporcional, antes de enviarlas al navegador.

¿El problema?

Básicamente es que no tengo ni idea de como abordar el tema, las imágenes con los campos BLOB de Firebird no acaban de ser una combinación cómoda.

¿Como abordo los distintos problemas?

Espero no estar preguntando algo trivial.

¡Saludos a todos!

roman
12-09-2008, 19:31:34
Yo comenzaría explorando las posibilidades de la biblioteca GD (http://www.php.net/manual/en/book.image.php) para PHP. De la lista (enorme) de funciones, parecen aplicar éstas:


imagecreatefromstring (http://www.php.net/manual/en/function.imagecreatefromstring.php)
imagecopyresized (http://www.php.net/manual/en/function.imagecopyresized.php)


La primera te serviría para crear un objeto GD a artir del campo BLOB. Supongo que para ello te servirán ibase_blob_open (http://mx2.php.net/manual/en/function.ibase-blob-open.php) e ibase_blob_get (http://mx2.php.net/manual/en/function.ibase-blob-get.php)

La segunda la usaría para crear la vista en miniatura, que es la que mandarías al navegador.

Buscando en el manual, puede verse en uno de los comentarios (http://www.php.net/manual/en/function.imagecreatefromstring.php#31178) un ejemplo con MySQL.

// Saludos

papulo
13-09-2008, 09:05:07
Gracias por la información, en cuanto tenga algo montado y funcionando, lo copiaré aquí para que si alguien mas tiene dudas sepa donde está la solución.

Saludos.

papulo
18-09-2008, 17:26:31
Lo prometido es deuda, aquí va la solución:

//Habremos hecho la query para capturar el blob antes.
$consulta = ibase_query($connection, $sql);
$data = ibase_fetch_object ($consulta);
$blob_data = ibase_blob_info($data->PICTURE);
$blob_hndl = ibase_blob_open($data->PICTURE);
$blob_imagen = ibase_blob_get($blob_hndl, $blob_data[0]);

$size = 150; // Tamaño de la mayor propocion de la nueva imagen
$imagen = imagecreatefromstring($blob_imagen);

$ancho_original = imagesx($imagen);
$alto_original = imagesy($imagen);

if($ancho_original>$alto_original){
$new_w = $size;
$new_h = abs($alto_original*$size/$ancho_original);
}else{
$new_h = $size;
$new_w = abs($ancho_original*$size/$alto_original);
}

$miniatura = imagecreatetruecolor($new_w,$new_h);

imagecopyresized($miniatura,$imagen,0,0,0,0,$new_w,$new_h,$ancho_original,$alto_original);
imagejpeg($miniatura);

Y por supuesto, 100000 gracias a Roman, de veras.

Saludos y espero que ayude a mas gente.