2006-09-14

Redimensionar imagenes con php - GD

Últimamente estoy haciendo mis primeros pinitos con php. Y como todo el mu7ndo comienzo buscando trozos de código que me puedan servir y así poco a poco ir montando mis propios códigos.

Lo que necesitaba en este caso era un código que introdujera una imagen en una carpeta del servidor y al mismo tiempo fabricara el thumbnail.

Estuve buscando por ahí y después de varios intentos encontré este código para redimensionar en forosdelweb.

Casi a la primera el código funcionaba. Pero hubo una cosa que no me gustó.
Normalmente cuando se hace un thumbnail se elige un cuadrado de tanto por tanto. De forma que cuando insertas una imagen que es más grande en su horizontal que en su vertical, el thumbnail toma el valor máximo de ese cuadrado como anchura.

Ejemplo:

si queremos un cuadrado de 120x120 pixeles para que no se nos desmaquete la web

imagen: 2200x1450---> thumbnail 120x79

imagen: 800x1600----> thumbnail 60x120

Total que programé un par de líneas más leyendo los datos de la anchura y la altura del archivo origen y redimensionando en su caso adecuadamente.

También tuve que manejar los ficheros y colocarlos en sus respectivas carpetas y darle los permisos adecuados.

Aquí os pongo el código:


function redimensionar($type, $img_original, $img_nueva, $img_nueva_anchura, $img_nueva_altura, $img_nueva_calidad)
{
$defecto = 'img/defecto.jpg';
if(file_exists($img_original)) {
// crear imagen desde original
$type=strtolower($type);
switch($type)
{
case 'jpeg': $img = ImageCreateFromJPEG($img_original); break;
case 'jpg': $img = ImageCreateFromJPEG($img_original); break;
case 'png': $img = ImageCreateFromPNG($img_original); breaK;
case 'gif': $img = ImageCreateFromGIF($img_original); breaK;
case 'wbmp': $img = ImageCreateFromWBMP($img_original); break;
default: $img = ImageCreateFromJPEG($defecto); break;
}
} else {
$img = ImageCreateFromJPEG($defecto);
}
if(!empty($img)) {
$new_w_R = ImageSX($img);
$new_h_R = ImageSY($img);
//$img_nueva_altura = 50;
// se calcula la relación alto/ancho
$aspect_ratio = $new_h_R/$new_w_R;
$aspect_ratio2 = $new_w_R/$new_h_R;
if ($new_w_R >= $new_h_R){
// se ajusta al nuevo tamaño
$img_nueva_altura = abs($img_nueva_anchura * $aspect_ratio);
}
else{$img_nueva_anchura = abs($img_nueva_altura * $aspect_ratio2);}
// crear imagen nueva

$thumb = ImageCreateTrueColor($img_nueva_anchura,$img_nueva_altura);
// redimensionar imagen original copiandola en la imagen. La imagen se reajustará al nuevo tamaño
ImageCopyResampled($thumb,$img,0,0,0,0,$img_nueva_anchura,
$img_nueva_altura,ImageSX($img),ImageSY($img));
// guardar la imagen redimensionada donde indica $img_nueva
ImageJPEG($thumb,$img_nueva,$img_nueva_calidad);
}
}

//inseción de imagen
//$fileName = $max."_".$_FILES['userfile']['name'];
$extension = explode(".",$_FILES['userfile']['name']);
//$fileName = $extension[0].".".$extension[1];
$fileName = $referencia.".".$extension[1];
$tmpName = $_FILES['userfile']['tmp_name'];
$fileSize = $_FILES['userfile']['size'];
$fileType = $_FILES['userfile']['type'];
//echo $tmpName;
$uploaddir = "/home/tusitio/www/img/";
$uploadfile = $uploaddir . $fileName ;

if (move_uploaded_file($tmpName, $uploadfile)) {
chmod($uploadfile, 0644);
//echo "File is valid, and was successfully uploaded.\n";
//redimensionar
$source=$uploadfile; // archivo de origen
$dest=$uploaddir.$referencia."th.".$extension[1]; // archivo de destino
$dest2=$uploaddir.$referencia.".".$extension[1]; // archivo de destino
// echo "nuevoarchivo ".$dest;
/* $img_nueva_anchura=120;
$img_nueva_altura=120;
$img_nueva_calidad=100;*/
//redimensionar_jpeg($source,$dest,$img_nueva_anchura, $img_nueva_altura, $img_nueva_calidad);
// Ejemplo
redimensionar("jpg",$source,$dest,120,120,95);
redimensionar("jpg",$source,$dest2,500,500,95);
//finredimensionar
} else {
// echo "Possible file upload attack!\n";
//echo 'Here is some more debugging info:';
//print_r($_FILES);
}


Ese es el código que al final utilicé. Espero que os pueda servir.

10 comentarios:

Anónimo dijo...

Muchas gracias maestro me sirvio mucho tu funcion...

Anónimo dijo...

gracias, era justo lo que necesitaba, y saludos desde mi Guatelinda

Ing. Daniel Castro dijo...

buenas tardes amigo, tengo algunas dudas con la funcion ya que necesitaria la primera parte. NO se si se utiliza completa incluyendo la parte del file, o se pueden utilizar por separado

avanzaweb dijo...

La función está pensada para redimensionar y guardar la imagen redimensionada.
Si le quitas lo del 'file' no la guardará. Obviamente la función se puede dividir en partes y la puedes utilizar en otras funciones según tus requerimientos.

Puedes por ejemplo coger la parte que detecta que tipo de archivo es jpg, gif o png y utilizarla en otro sitio sólo para eso...

ya sabes lo importante es tener una idea y realizarla...

MaTaMu3rToS dijo...

Una cosa los parametros que le pasas que son imagen nueva imagen y eso que son strings? o la imagen que le pasas es del tipo file y luego en img_nueva le pasas un string. Gracias

avanzaweb dijo...

Partiendo del ejemplo:
redimensionar("jpg",$source,$dest,140,140,95);

las dos variables declaradas son claramente string
$source indicaría donde se encuentra la imagen a redimensionar y $dest indicaría done la quieres guardar y el nombre con el cual la quieres guardar.
Serían $img_original, $img_nueva

Luego las funciones propias de php como ImageCreateFromJPEG se encargan de leer ese string como un file.

andres dijo...

Muchas gracias...!!! estaba buscando algo asi y que funcione bien hace rato... saludos...!!!

Anónimo dijo...

Hola amigos de consultas de PHP- el motivo es que yo soy semi novato con el codigo php y pues tengo un proyecto asignado donde tengo que subir imagen a mi servidor y este post es lo que andaba buscando, queda como anillo al dedo jejeje. bueno, al grano! necesito su ayuda por que no se como aplicar este codigo en mi formulario php... gracias, espero su ayuda lo antes posibleeeeeee.

Anónimo dijo...

Puedes ver si te esto te ayuda:

subir archivos php

Kalvin Manson dijo...

Cooooooll he tenido algunos problemas con la detección del type pero me fascina el código me ha ayudado mucho. xD