Redimensionar varios archivos

Iniciado por luiggy2, 26 Septiembre 2010, 19:14 PM

0 Miembros y 1 Visitante están viendo este tema.

luiggy2

Buenas!.
En estos últimos días estoy intentando redimensionar todas las fotos de una carpeta, para ello estoy usando el siguiente código.

Código (php) [Seleccionar]
<?php

//Recogemos variables;
$ruta=$_GET["ruta"];
$anchura=$_GET["anchura"];
$hmax=$_GET["altura"];

//Guardamos el nombre de las fotos en un array
$nombre glob($ruta.'\\*.{jpg,gif,png}'GLOB_BRACE); //Expresiones regulares
$numero_fotos=count($nombre); //No fotos.


//Bucle que abarque todas las fotos
for($i=0;$i<$numero_fotos;$i++)
{

$datos getimagesize($nombre[$i]); //Recogemos los datos de la foto [0][1][2] (ancho, alto, tipo)

if($datos[2]==1)
{
$img = @imagecreatefromgif($nombre[$i]);
};
if($datos[2]==2)
{
$img = @imagecreatefromjpeg($nombre[$i]);
};
if($datos[2]==3)
{
$img = @imagecreatefrompng($nombre[$i]);
};


/*
  aqui empieza lo bueno 
  como bien sabemos no podemos redimensionar una imagen vertical de la misma forma que una horizontal
 bueno esta parte del script no ayuda a poder hacerlo lo que realiza es dividir el ancho original entre 
  el ancho maximo y luego divide la altura original entre el resultado anterior
  bueno esto es para el ancho
*/


$ratio = ($datos[0] / $anchura);
$altura = ($datos[1] / $ratio);


/*
 Para el Alto
 sera esto primero pregunta si el alto es mayor que el alto maximo que hemos definido 
 esto solo significa que es una imagen vertical claro si la condicion nos da true
 lo que haremos sera multiplicar la altura maxima por la anchura que hemos definido
 y la dividimos entre la altura esto nos dara una imagen vertical apropiada para 
 nuestra muestra
*/


if($altura>$hmax)
{
   $anchura2 $hmax*$anchura/$altura;
   $altura $hmax;
   $anchura $anchura2;
};

//Creamos la imagen en blanco
$thumb imagecreatetruecolor($anchura,$altura);

// Sustituimos la imagen antigua por la nueva
imagecopyresampled($thumb$img0000$anchura$altura$datos[0], $datos[1]); 


// Guardamos la imagen con otro nombre. 


if($datos[2]==1)
{
imagegif($thumb,"thumb_".$i.".gif");
};
if($datos[2]==2)
{
imagejpeg($thumb,"thumb_".$i.".jpeg");
};
if($datos[2]==3)
{
imagepng($thumb,"thumb_".$i.".png"); 
};

// Destruimos la imagen temporal para no recargar el servidor 
imagedestroy($thumb);

};




?>


El problema es que después de solucionar varios errores, no consigo que funcione. Supongo que el error estará en algo tonto, pero ahora mismo no caigo.

Espero sus respuestas.


Pd.: La mayor parte del sódigo la saqué de esta web: http://www.codigolandia.com/art-Redimensionar+Imagenes+con+PHP-php-108.tc
" Las grandes ideas suelen salir la mayoría de veces de grandes estupideces "

~ Yoya ~

Tomando en cuenta las siguiente notas del uso de la función glob();


El problema puede estar en la expresión que creaste, nose puede saber con exactitud el tipo de valor que contiene la variable $ruta, para saber si ese es el problema...
Código (php) [Seleccionar]

<?php

//Guardamos el nombre de las fotos en un array
$nombre glob($ruta.'\\*.{jpg,gif,png}'GLOB_BRACE); //Expresiones regulares
$numero_fotos=count($nombre); //No fotos.


También pueda ser que no tengas permiso de escritura, en que SO lo estas probando?
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

luiggy2

Muchas gracias por responder.

La variuable $ruta es un array que contiene el nombre de todos los archivos. El problema no es ese ya que si hago un:
Código (php) [Seleccionar]
echo $nombre[$i];
me aparece el nombre del primer archivo 8solamente). Igual pasa con $datos. Sin embargo $ratio ya no lo muestra, por lo que el problema supongo que estrá al crear las imágenes:
Código (php,26) [Seleccionar]

//...

for($i=0;$i<$numero_fotos;$i++)
{

echo $nombre[$i]; //esto lo muestra

$datos = getimagesize($nombre[$i]);

echo $datos[0]."-".$datos[1]."-"$datos[2]; //Esto también lo muestra
if($datos[2]==1)
{
$img = @imagecreatefromgif($nombre[$i]);
};
if($datos[2]==2)
{
$img = @imagecreatefromjpeg($nombre[$i]);
};
if($datos[2]==3)
{
$img = @imagecreatefrompng($nombre[$i]);
};

$ratio = ($datos[0] / $anchura);

echo $ratio; // Esto ya no lo muestra

$altura = ($datos[1] / $ratio);


// ...


Lo estoy probando bajo windows xp con PHP Version 6.0.0-dev.

Thanks!
" Las grandes ideas suelen salir la mayoría de veces de grandes estupideces "

~ Yoya ~

Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.

luiggy2

Muchas gracias, lo probaré cuando tenga tiempo para ver si funciona.

De todas formas todavía me sigue picando la curiosidad de porque no no funciona mi código.


Saludos!
" Las grandes ideas suelen salir la mayoría de veces de grandes estupideces "

~ Yoya ~

Ps lo que te dije al principio, tu problema esta en en la expresión regular, yo eh probado el source y funciona correctamente modificando la regexp...

Dame un ejemplo de que valores puede recibir la variable $ruta y verifico si las regexp que hiciste esta correcta...

Código (php) [Seleccionar]
<?php
 
//Recogemos variables;
$anchura=$_GET["anchura"];
$hmax=$_GET["altura"];
 
//Guardamos el nombre de las fotos en un array
$nombre glob('*.{jpg,gif,png}'GLOB_BRACE); //Expresiones regulares
$numero_fotos=count($nombre); //No fotos.
 
 
//Bucle que abarque todas las fotos
for($i=0;$i<$numero_fotos;$i++)
{
 
$datos getimagesize($nombre[$i]); //Recogemos los datos de la foto [0][1][2] (ancho, alto, tipo)
 
if($datos[2]==1)
{
$img = @imagecreatefromgif($nombre[$i]);
};
if($datos[2]==2)
{
$img = @imagecreatefromjpeg($nombre[$i]);
};
if($datos[2]==3)
{
$img = @imagecreatefrompng($nombre[$i]);
};
 
 
/*
  aqui empieza lo bueno 
  como bien sabemos no podemos redimensionar una imagen vertical de la misma forma que una horizontal
 bueno esta parte del script no ayuda a poder hacerlo lo que realiza es dividir el ancho original entre 
  el ancho maximo y luego divide la altura original entre el resultado anterior
  bueno esto es para el ancho
*/
 
 
$ratio = ($datos[0] / $anchura);
$altura = ($datos[1] / $ratio);
 
 
/*
 Para el Alto
 sera esto primero pregunta si el alto es mayor que el alto maximo que hemos definido 
 esto solo significa que es una imagen vertical claro si la condicion nos da true
 lo que haremos sera multiplicar la altura maxima por la anchura que hemos definido
 y la dividimos entre la altura esto nos dara una imagen vertical apropiada para 
 nuestra muestra
*/
 
 
if($altura>$hmax)
{
   $anchura2 $hmax*$anchura/$altura;
   $altura $hmax;
   $anchura $anchura2;
};
 
//Creamos la imagen en blanco
$thumb imagecreatetruecolor($anchura,$altura);
 
// Sustituimos la imagen antigua por la nueva
imagecopyresampled($thumb$img0000$anchura$altura$datos[0], $datos[1]); 
 
 
// Guardamos la imagen con otro nombre. 
 
 
if($datos[2]==1)
{
imagegif($thumb,"thumb_".$i.".gif");
};
if($datos[2]==2)
{
imagejpeg($thumb,"thumb_".$i.".jpeg");
};
if($datos[2]==3)
{
imagepng($thumb,"thumb_".$i.".png"); 
};
 
// Destruimos la imagen temporal para no recargar el servidor 
imagedestroy($thumb);
 
};
 
 
 
 
?>
Mi madre me dijo que estoy destinado a ser pobre toda la vida.
Engineering is the art of balancing the benefits and drawbacks of any approach.