Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] php que muestre imagen

Estas en el tema de php que muestre imagen en el foro de PHP en Foros del Web. Hola amigos, como están, quisiera que me pudiesen ayudar, estoy realizando un php que permita visualizar las imágenes que tengo guardada en la base de ...
  #1 (permalink)  
Antiguo 30/09/2013, 08:12
 
Fecha de Ingreso: septiembre-2008
Mensajes: 72
Antigüedad: 15 años, 7 meses
Puntos: 0
Pregunta php que muestre imagen

Hola amigos, como están, quisiera que me pudiesen ayudar, estoy realizando un php que permita visualizar las imágenes que tengo guardada en la base de datos, tengo el siguiente código:

$idim=$_GET['id'];

$sqlImg="select octet_length(image) as peso, image, type from imágenes where id_imagen=$idimg";
$resultImg=pg_query($conn,$sqlImg);
if($rowImg=pg_fetch_array($resultImg)){
header ("Content-Length:".$rowImg['peso']);
header("Content-type: ".$rowImg['type']);
echo pg_unescape_bytea($rowImg['image']);
}

Hasta ahí funciona excelente, no tengo problemas, pero la imagen que he guardado es png, y cuando abro la ruta en el navegador la imagen me la muestra en jpg.

Se que hay que usar "imagecreatefrompng", he intentado usarlo de varias formas, pero no he tenido resultado. Si me pudiesen ayudar por favor se los agradecería infinitamente.

PD: Las imágenes solo las estoy guardando en la BD no en un directorio.

Saludos
  #2 (permalink)  
Antiguo 30/09/2013, 08:37
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: php que muestre imagen

" pero la imagen que he guardado es png, y cuando abro la ruta en el navegador la imagen me la muestra en jpg"

eso depende del content-type que estás generando, revisa los datos del registro
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #3 (permalink)  
Antiguo 30/09/2013, 08:53
 
Fecha de Ingreso: septiembre-2008
Mensajes: 72
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: php que muestre imagen

Gracias maycolalvarez, pero tengo bien puesto los datos por parte del registro.
  #4 (permalink)  
Antiguo 30/09/2013, 09:41
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: php que muestre imagen

¿y entonces como dices que te salen en jpg?: si el content-type es PNG, el navegador ha de decirte que es una imágen PNG, a no ser que el enlace hacia el archivo sea diferente, en tal caso depura con firebug para ver el request url
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #5 (permalink)  
Antiguo 30/09/2013, 09:47
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: php que muestre imagen

una sugerencia tonta, prueba a poner el:
Código PHP:
Ver original
  1. header("Content-type: ".$rowImg['type']);
antes que el otro header (suponiendo que en tu imagen png tienes bien cargado esto, que seria 'image/png')
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #6 (permalink)  
Antiguo 30/09/2013, 09:56
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: php que muestre imagen

@NSD realmente nunca tuve en cuenta el orden de los headers, sinceramente no se si afecte, pero tienes toda la razón con respecto al MIME, por el cual @tuuutooo debes de confirmarnos si lo tienes así
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #7 (permalink)  
Antiguo 30/09/2013, 16:55
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: php que muestre imagen

Maycol , no todos los header son conflictivos en cuanto al orden, solo unos pocos y el content type es uno de ellos, el conflicto surge porque la funcion header manda los datos de cabecera al navegador inmediatamente la SAPI las procesa, el navegador ni bien recibe la primera ya determina lo que tiene que hacer, si recibe un location no espera mas datos de esa pagina e inicia una redireccion, si recibe una cabecera cualquiera no espera mas cookies (es por esto que el session_start() siempre se usa al principio) si no recibe ninguna cabecera pero si contenido asume automaticamente el tipo mime y si este se le especifica despues mediante otro header no actualiza los datos. no estoy seguro de si content-lenght en particular afecta, pero si es el caso puede que este anulando el segundo header, pero no estoy seguro en este punto.

¿La solucion definitiva a los problemas de orden de header? esta en el manual de php:
Cita:
Se puede usar búfer de salida para evitar este problema, procesando en el servidor todo el contenido a mostrar en el navegador antes de ser enviado. Se puede hacer esto usando ob_start() y ob_end_flush() en el script, o definiendo la directiva output_buffering en el php.ini o en los ficheros de configuración del servidor.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #8 (permalink)  
Antiguo 30/09/2013, 17:00
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 11 años, 11 meses
Puntos: 320
Respuesta: php que muestre imagen

puede que si afecte, encontre este ejemplo en el manual de php sobre el uso de header y el orden:

Código PHP:
Ver original
  1. <?php
  2. $mm_type="application/octet-stream";
  3.  
  4. header("Cache-Control: public, must-revalidate");
  5. header("Pragma: hack");
  6. header("Content-Type: " . $mm_type);
  7. header("Content-Length: " .(string)(filesize($fullpath)) );
  8. header('Content-Disposition: attachment; filename="'.$filename.'"');
  9. header("Content-Transfer-Encoding: binary\n");
  10.                  
  11. readfile($fullpath);
  12. ?>

como se ve, content-type esta antes de content-lenght
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios
  #9 (permalink)  
Antiguo 01/10/2013, 13:21
 
Fecha de Ingreso: septiembre-2008
Mensajes: 72
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: php que muestre imagen

Gracias amigos por responder, les cuento que he tomado todas las sugerencias recibidas pero aún persisto con el error, de que al abrir el thumb en la web la imagen me la cambia de formato, si la guardo png, me la guarda en jpg.
  #10 (permalink)  
Antiguo 01/10/2013, 13:34
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: php que muestre imagen

Cita:
Iniciado por tuuutooo Ver Mensaje
Gracias amigos por responder, les cuento que he tomado todas las sugerencias recibidas pero aún persisto con el error, de que al abrir el thumb en la web la imagen me la cambia de formato, si la guardo png, me la guarda en jpg.
eso esta muy raro, si puedes postear el código que se encarga de guardar las imágenes sería lo ideal, porque ambos formatos jpg y png son completamente diferentes
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #11 (permalink)  
Antiguo 01/10/2013, 13:47
 
Fecha de Ingreso: septiembre-2008
Mensajes: 72
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: php que muestre imagen

Código PHP:
Ver original
  1. //Este es el código que inserta la imagen en la bd, la cual guarda bien como corresponde.
  2. $max_size = 2000000;
  3. if ($do_commit){
  4.     if($_FILES['fileImage']['tmp_name']!=""){
  5.         if (is_uploaded_file($_FILES['fileImage']['tmp_name']) && (filesize($_FILES['fileImage']['tmp_name']) <= $max_size)){
  6.             $fbin = file_get_contents($_FILES['fileImage']['tmp_name']);
  7.             $infoImg=getimagesize($_FILES['fileImage']['tmp_name']);
  8.             $ancho=$infoImg[0];
  9.             $altura=$infoImg[1];               
  10.             $type = $_FILES['fileImage']['type'];
  11.             $aux=$_FILES['fileImage']['tmp_name'];     
  12.            
  13.             if(($type=='image/pjpeg')||($type=='image/jpeg')||($type=='image/jpg')||($type=='image/gif') ||($type=='image/png') ||($type=='image/x-png ') ||($type=='application/octet-stream'))    {
  14.                  $class=new ImageAIT();              
  15.                  $ax1=$class->ReSize($_FILES['fileImage']['tmp_name'], $fbin, 480, 800, 1);// IMAGEN 480 * 800
  16.                  
  17.                  $ft1 = pg_escape_bytea($ax1);// 480 x 800
  18.                
  19.             }else{
  20.                 $do_commit=false;      
  21.                 $errmesg.="Error inesperado.<br>";
  22.             }      
  23.         }else{
  24.             $do_commit=false;      
  25.             $errmesg.="La imagen no se puede almacenar porque excede el peso maximo.<br>";
  26.         }
  27.     }
  28. }

Aquí va el código de quien muestra la imagen dinamicamente

Código PHP:
Ver original
  1. $idimg =$_GET['idim'];
  2.  
  3. $sqlImg="select octet_length(image) as peso, image, type from images where id_imagen=$idimg";
  4. $resultImg=pg_query($conn,$sqlImg);
  5. if($rowImg=pg_fetch_array($resultImg)){
  6.     do{
  7.         header ("Content-Length:".$rowImg['peso']);
  8.         header("Content-type: ".$rowImg['type']);
  9.         echo pg_unescape_bytea($rowImg['image']);
  10.     }while($rowImg=pg_fetch_array($resultImg));
  11. }

GRACIAS
  #12 (permalink)  
Antiguo 01/10/2013, 13:51
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: php que muestre imagen

$class=new ImageAIT();
$ax1=$class->ReSize($_FILES['fileImage']['tmp_name'], $fbin, 480, 800, 1);// IMAGEN 480 * 800

ése código u objeto en particular puede que esté cambiando la imagen original, revise ese aspecto.
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #13 (permalink)  
Antiguo 01/10/2013, 13:55
 
Fecha de Ingreso: septiembre-2008
Mensajes: 72
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: php que muestre imagen

Es la clase que uso

Código PHP:
Ver original
  1. class ImageAIT{
  2.     //  VARIABLES DE x-y CROP
  3.     var $xCrop;
  4.     var $yCrop;
  5.     //  VARIABLES DE w-h CROP
  6.     var $wCrop;
  7.     var $hCrop;
  8.    
  9.     /*****************************************************************
  10.     **      FUNCIONES DE REDIMENCIONAMIENTO
  11.     *****************************************************************/ 
  12.     //  FUNCION QUE REDIMENCIONA LA IMAGEN (PRIVADA)
  13.     private function doThumbnail($aux2,$image,$width,$height){
  14.         $th_t = imagecreatefromstring($image);
  15.         $thumb = imagecreatetruecolor($width,$height);
  16.         imagecopyresampled($thumb,$th_t,0,0,0,0,$width,$height,imagesx($th_t),imagesy($th_t));
  17.         ob_start();
  18.         imagejpeg( $thumb, NULL, 90 );
  19.         $thumbData = ob_get_contents();
  20.         ob_end_clean();
  21.         imagedestroy($th_t);
  22.         imagedestroy($thumb);
  23.         return $thumbData;
  24.     }
  25.     //  CREA LAS DIMENCIONES DE LA NUEVA IMAGEN RESPETANDO LOS TAMAÑOS MAXIMOS
  26.     function ReSize($img, $fbin1, $xRe, $yRe, $tp){
  27.         $infoImg=getimagesize($img);       
  28.         $ancho=$infoImg[0];
  29.         $altura=$infoImg[1];
  30.                    
  31.         $rtarget = $xRe/$yRe;
  32.         if (($ancho/$altura) > $rtarget){
  33.             $xdest = $xRe;
  34.             $ydest = round($altura/$ancho*$xRe);
  35.         }else{
  36.             $ydest = $yRe;
  37.             $xdest = round($ancho/$altura*$yRe);
  38.         }
  39.         if($tp==1){
  40.             $this->CenterImage(($xdest/2), ($ydest/2));
  41.         }
  42.         return $imagen1 = $this->doThumbnail($img,$fbin1,$xdest,$ydest);
  43.     }
  44.    
  45.     function ReSizeXY($fbin1, $xRe, $yRe, $tp, $x, $y){    
  46.         $ancho=$x;
  47.         $altura=$y;
  48.                    
  49.         $rtarget = $xRe/$yRe;
  50.         if (($ancho/$altura) > $rtarget){
  51.             $xdest = $xRe;
  52.             $ydest = round($altura/$ancho*$xRe);
  53.         }else{
  54.             $ydest = $yRe;
  55.             $xdest = round($ancho/$altura*$yRe);
  56.         }
  57.         if($tp==1){
  58.             $this->CenterImage(($xdest/2), ($ydest/2));
  59.         }
  60.         return $imagen1 = $this->doThumbnail($img,$fbin1,$xdest,$ydest);
  61.     }
  62.     /*****************************************************************
  63.     **      FUNCIONES DE CROP
  64.     *****************************************************************/     
  65.     //  SETEO DE VARS
  66.     function setXcrop($stx){
  67.         if(is_numeric($stx)){
  68.             $this->xCrop=$stx;
  69.         }
  70.     }  
  71.     function setYcrop($sty){
  72.         if(is_numeric($sty)){
  73.             $this->yCrop=$sty;
  74.         }
  75.     }
  76.     function setWcrop($stw){
  77.         if(is_numeric($stw)){
  78.             $this->wCrop=$stw;
  79.         }
  80.     }
  81.     function setHcrop($sth){
  82.         if(is_numeric($sth)){
  83.             $this->hCrop=$sth;
  84.         }
  85.     }
  86.     //  GETEO DE VARS
  87.     function getXcrop(){
  88.         return $this->xCrop;       
  89.     }      
  90.     function getYcrop(){
  91.         return $this->yCrop;       
  92.     }
  93.     function getWcrop(){
  94.         return $this->wCrop;       
  95.     }
  96.     function getHcrop(){
  97.         return $this->hCrop;       
  98.     }
  99.     //  OBTIENE EL CENTRO DE LA IMAGEN
  100.     private function CenterImage($auxX, $auxY){
  101.         $wAux=($this->wCrop/2);
  102.         $hAux=($this->hCrop/2);
  103.         $this->setXcrop($auxX-$wAux);
  104.         $this->setYcrop($auxY-$hAux);
  105.     }
  106.     //  CORTA UN TRAMO DEL CENTRO DE LA IMAGEN
  107.     function CropImageC($img, $image, $tpCrop){
  108.         if($tpCrop==0){
  109.             $infoImg=getimagesize($img);
  110.             $this->CenterImage(($infoImg[0]/2), ($infoImg[1]/2));
  111.         }
  112.         $src = imagecreatefromstring($image);
  113.         $dest = imagecreatetruecolor($this->wCrop, $this->hCrop);
  114.         imagecopy($dest, $src, 0, 0, $this->xCrop, $this->yCrop, $this->wCrop, $this->hCrop);
  115.         ob_start();
  116.         imagejpeg( $dest, NULL, 90 );
  117.         $thumbData = ob_get_contents();
  118.         ob_end_clean();
  119.         imagedestroy($dest);
  120.         imagedestroy($src);
  121.         return $thumbData;
  122.     }
  123.     //  CORTA UN TRAMO DEL LA IMAGEN POR LA POSICION X Y
  124.     function CropImageXY($image, $xRe, $yRe){
  125.         $src = imagecreatefromstring($image);
  126.         $dest = imagecreatetruecolor($this->wCrop, $this->hCrop);
  127.         imagecopy($dest, $src, 0, 0, $xRe, $yRe, $this->wCrop, $this->hCrop);
  128.         ob_start();
  129.         imagejpeg( $dest, NULL, 90 );
  130.         $thumbData = ob_get_contents();
  131.         ob_end_clean();
  132.         imagedestroy($dest);
  133.         imagedestroy($src);
  134.         return $thumbData;
  135.     }  
  136. }
  #14 (permalink)  
Antiguo 01/10/2013, 15:02
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: php que muestre imagen

si te fijas, en la línea 18 dicha clase cambia todo lo que le des, por JPEG (jpg), he allí el origen del problema
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...
  #15 (permalink)  
Antiguo 01/10/2013, 15:10
 
Fecha de Ingreso: septiembre-2008
Mensajes: 72
Antigüedad: 15 años, 7 meses
Puntos: 0
Respuesta: php que muestre imagen

Muchas gracias, he solucionado el tema pero desde donde mismo guarda la imagen, he comentado unas líneas y cambiado unas variables y ahora si me muestra como corresponde.

Muchas gracias por la ayuda
  #16 (permalink)  
Antiguo 01/10/2013, 15:13
Avatar de maycolalvarez
Colaborador
 
Fecha de Ingreso: julio-2008
Ubicación: Caracas
Mensajes: 12.120
Antigüedad: 15 años, 9 meses
Puntos: 1532
Respuesta: php que muestre imagen

Cita:
Iniciado por tuuutooo Ver Mensaje
Muchas gracias, he solucionado el tema pero desde donde mismo guarda la imagen, he comentado unas líneas y cambiado unas variables y ahora si me muestra como corresponde.

Muchas gracias por la ayuda
genial, sería bueno que postearas tu solución para que quede como aporte, además de darte + karma.

saludos
__________________
¡Por favor!: usa el highlight para mostrar código
El que busca, encuentra...

Etiquetas: select, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 14:10.