Foros del Web » Programando para Internet » PHP »

Problema al redimensionar imagenes con PHP

Estas en el tema de Problema al redimensionar imagenes con PHP en el foro de PHP en Foros del Web. Hola, a ver si pueden ayudarme. Tengo un script para tratar las imágenes, para que todas tengan el mismo tamaño, por lo que lo que ...
  #1 (permalink)  
Antiguo 27/06/2012, 08:56
 
Fecha de Ingreso: marzo-2007
Mensajes: 89
Antigüedad: 17 años
Puntos: 0
Problema al redimensionar imagenes con PHP

Hola, a ver si pueden ayudarme.

Tengo un script para tratar las imágenes, para que todas tengan el mismo tamaño, por lo que lo que hago es siempre creo un liezo desde GD y dependiendo de la imagen original le creo un tamaño u otro y la centro dentro del lienzo. Todo va bien, los tamaños se calculan bien, el problema es que la imagen en vez de hacerla mas pequeña la recorta al tamaño que le digo....

Mi código es:

Código PHP:
imagecopyresampled($lienzo$imagen_fuente$margenAncho$margenAlto00$anchoIMAGEN$altoIMAGEN$anchoLienzo$altoLienzo); 
Como digo los tamaños los hace bien pero no se porque me recorta la imagen en vez de rescalarla que es lo que necesito...

Tambien he probado "imagecopyresized" y nada...

Saben que puedo hacer para que no se recorte?

Gracias!
  #2 (permalink)  
Antiguo 27/06/2012, 09:54
 
Fecha de Ingreso: marzo-2007
Mensajes: 89
Antigüedad: 17 años
Puntos: 0
Respuesta: Problema al redimensionar imagenes con PHP

Parece que tiene que ver con las dimensiones del lienzo ya que si lo amplio mucho si redimensiona la imagen correctamente,...

Saben como solucionar esto?
  #3 (permalink)  
Antiguo 27/06/2012, 09:57
 
Fecha de Ingreso: marzo-2007
Mensajes: 89
Antigüedad: 17 años
Puntos: 0
Respuesta: Problema al redimensionar imagenes con PHP

Os pongo mi código:

Código PHP:
                @$datos_img getimagesize($imagen);
                
$ancho_orig $datos_img[0];
                
$alto_orig $datos_img[1];
        
        
$propORIGINAL devProporcion($ancho_orig,$alto_orig);
        
$propIMAGEN   devProporcion($anchoLienzo,$altoLienzo);
             
        if(
$propORIGINAL<$propIMAGEN){
        
//Es mas panorámica que la ideal, dejamos blancos arriba y bajo            
            
$anchoIMAGEN $anchoLienzo;
            
$altoIMAGEN round($anchoIMAGEN/$propORIGINAL);            
            
$caso "propORIGINAL<propIMAGEN";
            
//Volvemos a hacer comprobacion por si se sigue sobrepasando por el alto (REAJUSTE).
            
$margenAlto = ($altoLienzo $altoIMAGEN)/2;
            
$margenAncho 0;
            
            if(
$altoIMAGEN>$altoLienzo){
                
$altoIMAGEN $altoLienzo;
                
$anchoIMAGEN round($altoIMAGEN $propORIGINAL);
                
                
$margenAncho = ($anchoLienzo $anchoIMAGEN)/2;
                
$margenAlto  0;
            }
        }
        else{        
            
$altoIMAGEN $altoLienzo;
            
$anchoIMAGEN round($altoIMAGEN $propORIGINAL);
            
$caso "propORIGINAL>propIMAGEN";
            
//Volvemos a hacer comprobacion por si se sigue sobrepasando por el alto (REAJUSTE).
            
$margenAncho = ($anchoLienzo $anchoIMAGEN)/2;
            
$margenAlto  0;
            
            if(
$anchoIMAGEN>$altoLienzo){
                
$anchoIMAGEN $anchoLienzo;
                
$altoIMAGEN round($anchoIMAGEN/$propORIGINAL);    
                
$margenAlto = ($altoLienzo $altoIMAGEN)/2;
                
$margenAncho 0;
            }
        }        
        
        
        
//    CREO LA NUEVA IMAGEN
        
$lienzo imagecreatetruecolor($anchoLienzo$altoLienzo);
        
        
//    Rellenamos el lienzo de color
        
imagefilledrectangle($lienzo00$anchoLienzo$altoLienzo000000);

        
//    ABRO LA IMAGEN FUENTE
        
if (!$imagen_fuente abrir_Imagen($imagen)) {
            return 
0;
            exit;
        }
                
        
//    COPIO LA IMAGEN FUENTE EN LA NUEVA
        //imagecopyresampled($lienzo, $imagen_fuente, $margenAncho, $margenAlto, 0, 0, $anchoIMAGEN, $altoIMAGEN, $anchoLienzo, $altoLienzo);
        
imagecopyresized($lienzo$imagen_fuente$margenAncho$margenAlto00$anchoIMAGEN$altoIMAGEN$anchoLienzo$altoLienzo);
                                
        
        
imagejpeg($lienzo$destino$calidad); 
Gracias!
  #4 (permalink)  
Antiguo 27/06/2012, 10:49
 
Fecha de Ingreso: junio-2012
Ubicación: En mi casa
Mensajes: 13
Antigüedad: 11 años, 9 meses
Puntos: 0
Respuesta: Problema al redimensionar imagenes con PHP

No se si te has planteado usar un img de html, y luego guardarlo con php, es decir:
Código PHP:
Ver original
  1. <img src="tuimagen.jpg" height="50%" width="50%">
Con eso ya lo tienes redimensionado a la mitad y para guardarlo con un frwite
[URL="http://php.net/manual/es/function.fwrite.php"]http://php.net/manual/es/function.fwrite.php[/URL]

Ya perdonaras que no te ponga el codigo, pero no lo tengo a mano y tengo mala memoria

-Suerte
  #5 (permalink)  
Antiguo 27/06/2012, 11:02
 
Fecha de Ingreso: marzo-2007
Mensajes: 89
Antigüedad: 17 años
Puntos: 0
Respuesta: Problema al redimensionar imagenes con PHP

Niktro, gracias por tu respuesta.

El problema es que tengo unos cuantos miles de imágenes cada una de su madre y su padre y todas tengo que mostrarlas a unas dimensaiones exactas. Por lo que no me vale la opción de poonerlo con la etiqueta "<img".

Tengo que generar algún código con GD para que cree el lienzo la redimensione y la encuadre al centro.
  #6 (permalink)  
Antiguo 27/06/2012, 21:51
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 9 meses
Puntos: 39
Respuesta: Problema al redimensionar imagenes con PHP

Veras, yo tenia el mismo problema que tu y la solucion que le di fue redimensionarlas al guardarlas en la BD, para disminuirles el tamaño. Pero aun asi cada una queda con dimensiones diferentes, asi que me idee una funcion en PHP, para que segun las dimensiones de la imagen, le diera un top o un left negativo para encuadrarla en una capa overgflow y asi quede encuadrada en el centro.

Primero guardo la imagen con este codigo en este caso un ancho o un alto maximo de 120 dependiendo de si la imagen es mas alta que ancha o viceversa.
Código PHP:
Ver original
  1. $fotoOriginal = "La foto original que sube el usuario";
  2. $altoancho = GetImageSize($fotoOriginal);
  3. $ancho = $altoancho[0];
  4. $alto = $altoancho[1];
  5. $medidaMax = 120;
  6. //Destino foto normal
  7. $destinoNorm = "URLdestino.jpg";    
  8. //Proporcionamos la imagen a un maximo de 120px para un lado
  9. if(($ancho > $medidaMax)&&($alto > $medidaMax)){
  10.     if(($ancho > $alto)or($ancho == $alto)){
  11.            $resta = $ancho - $medidaMax;
  12.         $porcentaje = ($resta*100)/$ancho;
  13.         $alto_def = $alto-(($alto*$porcentaje)/100);
  14.  
  15.         $alto = round($alto_def);
  16.         $ancho = $medidaMax;
  17.     }else if($ancho < $alto){
  18.             $resta = $alto - $medidaMax;
  19.         $porcentaje = ($resta*100)/$alto;
  20.         $ancho_def = $ancho-(($ancho*$porcentaje)/100);
  21.            
  22.         $alto = $medidaMax;
  23.         $ancho = round($ancho_def);
  24.     }
  25. }else{
  26.     $ancho = $altoancho[0];
  27.     $alto = $altoancho[1];
  28. }
  29. //Copiamos la imagen dentro de un thumb redimensionado y la subimos al servidor
  30. $thumb = imagecreatetruecolor($ancho,$alto);
  31. $resource = imagecreatefromjpeg($fotoOriginal);
  32. imagecopyresampled($thumb,$resource,0,0,0,0,$ancho,$alto,$altoancho[0],$altoancho[1]);
  33. $copy = imagejpeg($thumb,$destinoNorm,90);
  34. imagedestroy($thumb);

Despues utilizo esta funcion para darle el ancho y alto con el que quiero mostrar la imagen, esta funcion php, iria en la misma pagina donde se va a mostrar el HTML.
Código PHP:
Ver original
  1. //Funcion de ridemensionar fotos
  2.  
  3. function redimensionar($foto,$alto_capa,$ancho_capa){
  4.     if($foto == ""){
  5.         $foto = "URL foto por defecto para todos los usuarios";
  6.     }
  7.    
  8.     $altoancho = GetImageSize($foto);  
  9.     $alto = $altoancho[1];
  10.     $ancho = $altoancho[0];
  11.    
  12.     if(($ancho > $alto)or($ancho == $alto)){
  13.    
  14.         $resta = $alto - $alto_capa;
  15.         $porcentaje = ($resta*100)/$alto;
  16.         $ancho_def = $ancho-(($ancho*$porcentaje)/100);    
  17.    
  18.         $alto = $alto_capa;
  19.         $ancho = round($ancho_def);
  20.         $prop_left = round(($ancho_capa*15)/100);
  21.         if($ancho < ($ancho_capa + $prop_left)){
  22.             $ancho = $ancho_capa + $prop_left;
  23.         }
  24.         $style = "left:-".$prop_left."px";
  25.    
  26.     }else if($ancho < $alto){
  27.    
  28.         $resta = $ancho - $ancho_capa;
  29.         $porcentaje = ($resta*100)/$ancho;
  30.         $alto_def = $alto-(($alto*$porcentaje)/100);
  31.    
  32.         $ancho = $ancho_capa;
  33.         $alto = round($alto_def);
  34.         $prop_top = round(($alto_capa*10)/100);
  35.         if($alto < ($alto_capa + $prop_top)){
  36.             $alto = $alto_capa + $prop_top;
  37.         }
  38.         $style = "top:-".$prop_top."px";
  39.    
  40.     }
  41.  
  42. return '<div style=" position:absolute; '.$style.'">
  43.            <img src="'.$foto.'" width="'.$ancho.'px" height="'.$alto.'px" />
  44.        </div>
  45.        ';        
  46. }

Si te fijas esta funcion retorna una division cuyas propiedades de ancho alto y posicionamiento dentro de la capa HTML, se le dan segun las dimensiones de la foto que se vaya a mostrar.

Y por ultimo lo muestro de una division con esta caracteristicas en la que le doy las medidas que quiero que tenga.

Código CSS:
Ver original
  1. .fotoPerfil{
  2.         position:relative;
  3.         height:80px;
  4.         width:80px;
  5.         overflow:hidden;
  6. }
Código HTML:
Ver original
  1. <div id="fotoPerfil" class="fotoPerfil">
  2.         <!--AQUÍ LLAMAS A LA FUNCION DE REDIMENSIONAR CON LAS DIMENSIONES EN LAS QUE QUIERAS MOSTRAR  LAS FOTOS-->
  3.         <? echo redimensionar("URL de la foto",80,80) ?>
  4. </div>

Si te fijas, aqui le doy a la funcion que me muestre la imagen con unas dimensiones de 80*80px dentro de una capa con la propiedad de overflow"hidden". Y si te vuelves a fijar en la funcion "redimensionar" le doy un left o un top negativo dependiendo de las dimensiones de la foto, con lo que queda centrada en la division y la parte restante oculta por el overflow de la misma.

No se si lo entenderas, pero si copias el codigo y lo pruebas seguro que lo ves mas claro,

Etiquetas: imagenes, redimensionar
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 05:11.