Ver Mensaje Individual
  #2 (permalink)  
Antiguo 15/08/2010, 17:09
MoebiusDigital
 
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