Author Topic: (SOLUCIONADO) Manejo de imagenes PNG y blob mysql  (Read 4067 times)

remizero

  • Jr. Member
  • **
  • Posts: 66
  • Karma: 0
    • View Profile
    • Blog personal de programación y linux
(SOLUCIONADO) Manejo de imagenes PNG y blob mysql
« on: Octubre 19, 2011, 03:08:25 am »
Buenas amigos del foro.

De nuevo por aquí dando que hacer, en esta oportunidad les vengo a consultar por un inconveniente que se me está presentando al momento de guardar imágenes PNG en mysql.

El problema es que al mostrar la imagen, no se me muestra de forma correcta, es decir, se me muestra solo la mitad de la imagen. Me he percatado que solo sucede cuando la imagen posee transparencias, pero esto es algo que debo solventar porque algunos usuarios podrían utilizar imágenes PNG (que en su mayoría serían en este formato) y podrían tener transparencia.

Se que puedo limitar o restringir este tipo de características para las imágenes pero también pudiera suceder que el usuario no tenga el conocimiento de saber que tiene o no transparencia la imagen :S.

El código que utilizo para hacer la conversión es uno de los dos códigos más comunes que se consiguen en todas partes por Internet, y funciona "BIEN".

Este es el código que utilizo para hacer la conversión a bytes.

Code: [Select]
public static function pngABlob ( $archivo ) {

        $imagenCreada = imagecreatefrompng ( $archivo );
        ob_start ();
        imagepng ( $imagenCreada );
        $imagen = ob_get_contents ();
        ob_end_clean ();
        return base64_encode ( $imagen );
}


Funciona "BIEN" porque si lo ajusto para guardar imágenes de tipo jpg, gif me las guarda y las muestra perfectamente, y si utilizo imágenes PNG sin transparencias también las muestra sin problema.

Alguien me podría indicar como debo hacer el manejo de este tipo de imágenes PNG para mostrar correctamente las transparencias?

De antemano muchas gracias.

PD. Se que muchos me dirán que no es recomendable guardar las imágenes en base de datos, pero aun así eso es lo que tengo que hacer, porque así lo requiere el sistema.
« Last Edit: Marzo 16, 2012, 10:04:59 am by remizero »
Si quieres ver cambios, comienza por cambiar tu primero
http://www.remizero.blogspot.com/
http://www.ecosoftware.com.ve/

remizero

  • Jr. Member
  • **
  • Posts: 66
  • Karma: 0
    • View Profile
    • Blog personal de programación y linux
Re: Manejo de imagenes PNG y blob mysql
« Reply #1 on: Marzo 16, 2012, 10:04:26 am »
Buenas amigos.

Hoy después de mucho tiempo he revivido este post que yo mismo creé, porque justamente hoy he conseguido la solución al problema planteado.

Sin más aquí la solución.

Code: [Select]
/**
     * Convierte un archivo png en formato binario.
     *
     * @param string $archivo
     * @return objeto de tipo blob.
     */
    public static function pngABlob ( $archivo ) {

        $imagenCreada = imagecreatefrompng ( $archivo );

        if ( imagealphablending ( $imagenCreada, true ) ) {//SI SE ESTABLECE EL CANAL ALPHA

            imagesavealpha ( $imagenCreada, true );
        }
        ob_start ();
        imagepng ( $imagenCreada );
        $imagen = ob_get_contents ();
        ob_end_clean ();
        return base64_encode ( $imagen );
    }

Lo único diferente es que para poder manejar las transparencias hay que usar las siguientes líneas de código:

Code: [Select]
imagealphablending ( $imagenCreada, true )
Para establecer el canal ALPHA

y
Code: [Select]
imagesavealpha ( $imagenCreada, true );
para guardar el canal ALPHA si es establecido

y con esto doy por terminado este post, espero les sirva de ayuda.

PD: si desean mostrar el resultado de este código, solo tienen que hacer uso de la siguiente línea de código:
Code: [Select]
echo '<img src="' . Imagenes::mostrarBlob ( $mi_objeto->getImagen () ) . '"/>';

donde mostrarBlob es esto:
Code: [Select]
public static function mostrarBlob ( $blob ) {

        $mime = Archivos::obtenerMimeTypeBlob ( $blob );
        return "data:" . $mime . ";base64," . $blob;
    }

y obtenerMimeTypeBlob es
Code: [Select]
public static function obtenerMimeTypeBlob ( $blob ) {
        $Types = array (
            "474946383761"=>"image/gif",
            "474946383961"=>"image/gif",
            "89504E470D0A1A0A"=>"image/png",
            "FFD8FFE0"=>"image/jpeg",
            "FFD8FFE1"=>"image/jpeg",
            "FFD8FFE8"=>"image/jpeg",
            "25504446"=>"application/pdf",
            "377ABCAF271C"=>"application/zip",
            "504B0304"=>"application/zip",
        );
       
        $blob = base64_decode ( $blob );

        $Signature = substr ( $blob, 0, 60 );
        $Signature = array_shift ( unpack ( "H*", $Signature ) );

        foreach ( $Types as $MagicNumber => $Mime ) {
            if ( stripos ( $Signature, $MagicNumber ) === 0 ) {
                return $Mime;
            }
        }
        return "application/octet-stream";
    }

Muchas gracias de todas formas aunque se que el manejo de imagen no es el fuerte de muchos de nosotros, hasta una próxima.
« Last Edit: Marzo 16, 2012, 10:11:54 am by remizero »
Si quieres ver cambios, comienza por cambiar tu primero
http://www.remizero.blogspot.com/
http://www.ecosoftware.com.ve/

 

ey