Foros del Web » Programando para Internet » PHP »

Problema al redimensionar imágenes

Estas en el tema de Problema al redimensionar imágenes en el foro de PHP en Foros del Web. Hola, estoy haciendo una aplicación y al realizar la redimensión de las imágenes al subirlas, algunas de ellas me aparecen algo desconfiguradas (por llamarlo de ...
  #1 (permalink)  
Antiguo 06/08/2010, 03:39
 
Fecha de Ingreso: julio-2010
Mensajes: 6
Antigüedad: 13 años, 8 meses
Puntos: 0
Pregunta Problema al redimensionar imágenes

Hola,

estoy haciendo una aplicación y al realizar la redimensión de las imágenes al subirlas, algunas de ellas me aparecen algo desconfiguradas (por llamarlo de alguna forma):

El código es el siguiente:

Código PHP:

$foto
->insert($conexion);
$nuevo_id mysql_insert_id();
echo(
mysql_error());
            
//LA AÑADIMOS FÍSICAMENTE
$uploaddir="./fotos_inmuebles/ref_"$foto->referencia."/";    $nombre_fichero=$nuevo_id."_".$foto->nombre strrchr($HTTP_POST_FILES['archivo']['name'],'.'); 

$especiales = array("á","é","í","ó","ú","ñ","Á","É","Í","Ó","Ú","Ñ");
$correc_especiales = array("a","e","i","o","u","ny","A","E","I","O","U","NY");

$nombre_fichero str_replace($especiales,$correc_especiales,$nombre_fichero);
$uploadfile $uploaddir $nombre_fichero;

if(!
move_uploaded_file($HTTP_POST_FILES['archivo']['tmp_name'], $uploadfile))
    {
        print(
"<script>alert('No se ha copiado la foto');</script>");
    }

$origen=$uploadfile;
$destino=$uploadfile;
$destino_temporal=tempnam("./tmp/","tmp");
redimensionar_jpeg($origen$destino_temporal600450100);

// guardamos la imagen
$fp=fopen($destino,"w");
fputs($fp,fread(fopen($destino_temporal,"r"),filesize($destino_temporal)));
fclose($fp);

chmod($destino0755);

$foto->updateNombreFichero($conexion,$uploadfile,$nuevo_id);
echo(
mysql_error()); 
La función redimensionar_jpeg:

Código PHP:
function redimensionar_jpeg($img_original$img_nueva$img_nueva_anchura$img_nueva_altura$img_nueva_calidad)

    
// crear una imagen desde el original 
    
$img ImageCreateFromJPEG($img_original); 
    
// crear una imagen nueva 
    
$thumb imagecreatetruecolor($img_nueva_anchura,$img_nueva_altura); 
    
// redimensiona la imagen original copiandola en la imagen 
    
ImageCopyResized($thumb,$img,0,0,0,0,$img_nueva_anchura,$img_nueva_altura,ImageSX($img),ImageSY($img)); 
     
// guardar la nueva imagen redimensionada donde indicia $img_nueva 
    
ImageJPEG($thumb,$img_nueva,$img_nueva_calidad);
    
ImageDestroy($img);


¿Alguna idea de por qué ocurre esto?

Un saludo y gracias
  #2 (permalink)  
Antiguo 15/08/2010, 17:09
 
Fecha de Ingreso: junio-2007
Ubicación: Buenos Aires, Argentina
Mensajes: 262
Antigüedad: 16 años, 10 meses
Puntos: 1
Respuesta: Problema al redimensionar imágenes

¿A qué te referís con "desconfiguradas"? Si es a que se deforman las dimensiones es esperable, ya que estás asignándole un ancho y un alto predeterminado (600x450) a una imagen que puede ser de 1000x250px.

Si es necesario que las nuevas imágenes tengan esas dimensiones, deberías cortarla para que se ajuste sin deformarse. Por ejemplo: comprobar si la imagen a 450px de alto sobrepasa el ancho permitido (600px) y entonces cortarla a ese ancho.

Si no es necesario que el tamaño sea exacto, lo mejor es definir una de las dos simensiones como constante (por ejemplo: todas tendrán 600px de ancho) y establecer un alto relativo con una regla de tres:

Código PHP:
Ver original
  1. $yNuevo = ($xNuevo*$yOriginal)/$xOriginal;

Este script lo armé hace tiempo de manera genérica para redimensionar imágenes. Permite redomensiones, establecer anchos y altos fijos y recortes tanto para JPGs, GIFs y PNGs (estos dos últimos con un parámetro para mantener una capa como transparente):

Código PHP:
Ver original
  1. <?php
  2.     // Funciones para limpiar caracteres latinos
  3.         require_once('../fns/str.php');
  4.         // Si no pasé el tipo de la imagen como parámetro, establece que es JPG
  5.     $tipo = 'jpg';
  6.         if (isset($_GET['t'])){
  7.         $tipo = $_GET['t'];
  8.     }
  9.     $ruta = trim($_GET['f']);
  10.     // Se fija si el archivo que le pasé tiene incluida la extensión... si no la tiene, se la agrega
  11.         if (!strstr($ruta, $tipo)){
  12.         $ruta .= '.'.$tipo;
  13.     }
  14.    
  15.         $maxSize = 0;
  16.     $alpha = 0;
  17.     // Parámetro para establecer si tengo dimensiones "obligatorias" como en tu script
  18.     if (isset($_GET['r']) and ($_GET['r'] == 1)){
  19.         $maxSize = 1;
  20.     }
  21.     // Transparencia
  22.     if (isset($_GET['alpha']) and ((strlen($_GET['alpha']) == 3) or (strlen($_GET['alpha']) == 3))){
  23.         $alpha = HexToRGB($_GET['alpha']);
  24.     }
  25.    
  26.     switch ($tipo){
  27.         case 'jpg':
  28.             $fuente = imagecreatefromjpeg($ruta);
  29.             break;
  30.         case 'png':
  31.             $fuente = imagecreatefrompng($ruta);
  32.             break;
  33.         case 'gif':
  34.             $fuente = imagecreatefromgif($ruta);
  35.             break;
  36.     }
  37.    
  38.     $imgancho = imagesx($fuente);
  39.     $imgalto = imagesy($fuente);
  40.    
  41.     // Si paso ancho y alto...
  42.     if (isset($_GET['w']) and isset($_GET['h']) and ($_GET['w'] <> '') and ($_GET['h'] <> '')){
  43.         $ancho = $_GET['w'];
  44.         $alto = $_GET['h'];
  45.     // Si paso sólo el ancho...
  46.     } elseif (isset($_GET['w']) and ($_GET['w'] <> '')){
  47.         $ancho = $_GET['w'];
  48.         $alto = ($ancho*$imgalto)/$imgancho;
  49.     // Si paso sólo el alto...
  50.     } elseif (isset($_GET['h']) and ($_GET['h'] <> '')){
  51.         $alto = $_GET['h'];
  52.         $ancho = ($alto*$imgancho)/$imgalto;
  53.     } else {
  54.                 // Si no pasé ni ancho ni alto como parámetro, crea la imagen en 50x50px
  55.         $ancho = 50;
  56.         $alto = 50;
  57.     }
  58.    
  59.     if ($maxSize == 1){
  60.         if  (($ancho > $imgancho) or ($alto > $imgalto)){
  61.             $ancho = $imgancho;
  62.             $alto = ($ancho*$imgalto)/$imgancho;
  63.         }
  64.     }
  65.    
  66.     if (isset($_GET['recortar']) and ($_GET['recortar'] == 1)){
  67.         $imgalto = $alto;
  68.     }
  69.    
  70.    
  71.    
  72.     $nueva = imagecreatetruecolor($ancho, $alto);
  73.     if (is_array($alpha)){
  74.         $transparente = imagecolorallocate($nueva, 255, 255, 255);
  75.         imagefill($nueva, 0, 0, $transparente);
  76.         imagecolortransparent($nueva, $transparente);
  77.     }
  78.     imagecopyresized($nueva,$fuente,0,0,0,0,$ancho,$alto,$imgancho,$imgalto);
  79.    
  80.     switch ($tipo){
  81.         case 'jpg':
  82.             header("Content-type: image/jpeg");
  83.             imagejpeg($nueva);
  84.             break;
  85.         case 'png':
  86.             header("Content-type: image/png");
  87.             imagepng($nueva);  
  88.             break;
  89.         case 'gif':
  90.             header("Content-type: image/gif");
  91.             imagegif($nueva);
  92.             break;
  93.     }
  94. ?>

Espero que te ayude. Si alguien ve este script y sugiere mejoras, son bienvenidas.

Saludos,
Pablo
__________________
Moebius Digital | La pieza que faltaba
Diseño web | Web hosting
  #3 (permalink)  
Antiguo 16/08/2010, 02:33
 
Fecha de Ingreso: julio-2010
Mensajes: 6
Antigüedad: 13 años, 8 meses
Puntos: 0
Respuesta: Problema al redimensionar imágenes

Hola Pablo,

muchas gracias por la respuesta, pero la deformación a la que me refiero no es la que has explicado, disculpa si me expresé mal en el mensaje anterior.

Cuando digo que las imágenes salen distorsionadas me refiero a algo como esto:

[URL="http://www.imaxenes.com/imagen/13416_vistas1wl03sr.jpg.html"]http://www.imaxenes.com/imagen/13416_vistas1wl03sr.jpg.html[/URL]

Como véis, la imagen se ve mal a partir de la mitad aproximadamente.

Creo que debe ser por problemas de configuración de php.ini.

Así que si alguien se le ocurre algo, agradecería cualquier información.

Saludos.
  #4 (permalink)  
Antiguo 17/08/2010, 13:07
 
Fecha de Ingreso: junio-2007
Ubicación: Buenos Aires, Argentina
Mensajes: 262
Antigüedad: 16 años, 10 meses
Puntos: 1
Respuesta: Problema al redimensionar imágenes

Ah, comprendo. Me temo que nunca me había pasado algo similar... éxitos en la búsqueda.
__________________
Moebius Digital | La pieza que faltaba
Diseño web | Web hosting

Etiquetas: 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 22:16.