Redimensionar en PHP a tamaño fijo
Escrito por Alex Barros Esta es una técnica para redimensionar imágenes a un tamaño fijo (aunque no guarde proporción), sin distorsionar la imágen.
No, no se trata del escalado líquido. Esa técnica es demasiado compleja. Se trata de recortar la imágen para adaptarla a la nueva resolución, perdiendo el mínimo espacio posible.

Foto de Basajaun en Flickr Licencia CC(by-nc-sa)
Para hacer esto, he desarrollado este algoritmo, que paso a compartir con todos para que lo uséis como os de la gana (requiere Biblioteca GD)
-
function resizeFit($im,$width,$height) {
-
//Original sizes
-
$ow = imagesx($im); $oh = imagesy($im);
-
-
//To fit the image in the new box by cropping data from the image, i have to check the biggest prop. in height and width
-
if($width/$ow > $height/$oh) {
-
$nw = $width;
-
$nh = ($oh * $nw) / $ow;
-
$px = 0;
-
$py = ($height - $nh) / 2;
-
} else {
-
$nh = $height;
-
$nw = ($ow * $nh) / $oh;
-
$py = 0;
-
$px = ($width - $nw) / 2;
-
}
-
-
//Create a new image width requested size
-
$new = imagecreatetruecolor($width,$height);
-
-
//Copy the image loosing the least space
-
imagecopyresampled($new, $im, $px, $py, 0, 0, $nw, $nh, $ow, $oh);
-
-
return $new;
-
}
Cómo utilizar
Si no estás familiarizado con la edición de imágenes en PHP, no te preocupes. Para utilizar la función de arriba, tenemos que pasarle como parámetro una imágen tipo resource de GD y dos números indicando el ancho y alto que queréis forzar a la foto.
Para que se vea, hay que editar las cabeceras HTTP indicando que el contenido es una imágen. Y a este archivo de imágen (aunque sea un PHP) se le puede llamar desde la etiqueta img de HTML. Dejemos que hable el código:
imagen.php
-
//Primero creo el resource de la imagen desde el original en JPEG
-
$im = imagecreatefromjpeg(‘original.jpg’);
-
-
//Ahora uso la función antes definida, con unos parámetros de ancho y alto que yo quiera
-
$resized = resizeFit($im, 100, 150);
-
-
//Indico en la cabecera HTTP que es una imagen
-
-
//Por último exporto la nueva imagen
-
imagepng($resized);
miPagina.html
-
<p>Esta es mi foto redimensionada a 100 x 150:</p>
-
<img src="imagen.php">
Puedes ver un ejemplo en …
Esta técnica la uso en GeoGPS para mostrar las imágenes al tamaño que yo le diga, sin que se vean distorsionadas. Échale un ojo, y de paso ves las rutas tan increíbles que está subiendo la gente.
Categorias: Código, Diseño, Imagen Digital, PHP |



Respeta el copyleft
Noviembre
13:12 Rafa Ha dicho:
¿como podria usar esto a la vez que se carga el archivo en el servidor, o sea, con un archivo que se acaba de subir mediante un formulario y que, posteriormente al redimensionado, se va a guardar en el servidor mediante move_upload_file (creo que se escribe así)? Si se ha cargado mediante Post se supone que el archivo está, hasta que se guarde, en una ubicacion temporal en el servidor y se accederia a el mediante $_FILES['archivo'][temp_name'] (no se si la sintaxis es correcta, escribo de memoria). El problema es que cuando intento asignar ese archivo a una variable y luego pasarla como parametro en imagecopyresampled (por ej. $imagen=$_FILES['archivo'][temp_name']; y luego imagecopyresampled($nueva, $imagen…etc)), no obtengo el resultado que quiero; vamos, que falla incluso el guardado de la foto.
Noviembre
3:27 Alex Barros Ha dicho:
Puedes usar el archivo temporal para instanciar la imagen
$im = imagecreatefromjpeg($_FILES['archivo'][tmp_name']);
y al final, en lugar de imprimir la imagen, la guardas con las funciones de exportado de imagen (imagepng, imagejpeg, imagegif)
te recomiendo png:
imagepng($im,’/minuevaimagen.png’)