Redimensionar en PHP a tamaño fijo
Escrito por Alex Barros Ver también Guía básica para editar imágenes en php con GD
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 Gpsia 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’)
mayo
11:41 Paco Ha dicho:
Excelente tuto compañero, llevaba tiempo queriendo encontrar una solucion así para hacer fijo el tamaño de los avatares de mis usuarios.
Funciona a la perfección.
Mil gracias.
octubre
16:37 carlos Ha dicho:
hombre me funciona perfecto pero tengo algunos problemas
1.- según veo tu buscas la imagen en imagen.php hasta aquí ok pero como tendría que hacer para redimencionar varias imagenes que busco en un while.
yo hago
<?php……
//conexion, select etc…
while($datos=mysql_fetch_array($sql))
{
echo "”;
}
….
como le paso todas mis imágenes de base de datos? trate con poner una variable en imagen.php pero no me dio resultados.
Lo otro cuando hago esto ademas me trae imágenes .png, .jpg y .gif como le hago para que el redimencionador sepa que imagen le voy a entregar :/
supongo que sera agregar algo como :
if($datos[2]==1){$img = @imagecreatefromgif($nombre);}
if($datos[2]==2){$img = @imagecreatefromjpeg($nombre);}
if($datos[2]==3){$img = @imagecreatefrompng($nombre);}
y despues
if($datos[2]==1){header(“Content-type: image/gif”); imagegif($thumb);}
if($datos[2]==2){header(“Content-type: image/jpeg”);imagejpeg($thumb);}
if($datos[2]==3){header(“Content-type: image/png”);imagepng($thumb); }
esto lo tengo en un redimencionador pero que no recorta :/
septiembre
18:58 lorena Ha dicho:
Hola, me gustaría que alguien pudiera ayudarme
tengo que hacer un catalogo en donde las imágenes no se deformen, veo que encontraron la solución pero sinceramente no entiendo como aplicarla.
Son mas de 500 fotografías para un tamaño predeterminado y necesito se autoajusten pero sin que se deformen.
de antemano gracias