Ver Mensaje Individual
  #6 (permalink)  
Antiguo 27/06/2012, 21:51
Avatar de manuparquegiralda
manuparquegiralda
 
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 10 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,