Redimensionar imágenes en PHP

Es habitual que cuando en una web trabajamos con imágenes tengas que presentar la misma en varios tamaños. Una opción es redimensionarla en pantalla con CSS… pero es una mala opción. Es una mala opción porque lo que haces es cargar una imagen grande y luego procesarla para hacerla pequeña, por lo que ralentizas la carga de la página. ¿La solución? Guardar una copia reducida de la imagen, lo que se llama un thumbnail.

¿Y cómo reducir la imagen? Bueno, PHP incluye la librería GD que nos permite tratar y creawr imágenes. Y además, en este caso, vamos a redimensionar la imagen manteniendo la proporción.

//Ruta de la original
$rtOriginal="/images/example.jpg";
	
//Crear variable de imagen a partir de la original
$original = imagecreatefromjpeg($rtOriginal);
	
//Definir tamaño máximo y mínimo
$max_ancho = 150;
$max_alto = 150;

//Recoger ancho y alto de la original
list($ancho,$alto)=getimagesize($rtOriginal);

//Calcular proporción ancho y alto
$x_ratio = $max_ancho / $ancho;
$y_ratio = $max_alto / $alto;

Con esto ya tenemos los datos para mantener las proporciones de la imagen. Ahora toca calcular el tamaño:

if( ($ancho <= $max_ancho) && ($alto <= $max_alto) ){
//Si es más pequeña que el máximo no redimensionamos
	$ancho_final = $ancho;
	$alto_final = $alto;
}
//si no calculamos si es más alta o más ancha y redimensionamos
elseif (($x_ratio * $alto) < $max_alto){
	$alto_final = ceil($x_ratio * $alto);
	$ancho_final = $max_ancho;
}
else{
	$ancho_final = ceil($y_ratio * $ancho);
	$alto_final = $max_alto;
}

Con esto ya tenemos el tamaño de la imagen con las proporciones guardadas. Finalmente nos queda crear la imagen y guardarla:

//Crear lienzo en blanco con proporciones
$lienzo=imagecreatetruecolor($ancho_final,$alto_final);	

//Copiar $original sobre la imagen que acabamos de crear en blanco ($tmp)
imagecopyresampled($lienzo,$original,0,0,0,0,$ancho_final, $alto_final,$ancho,$alto);

//Limpiar memoria
imagedestroy($original);

//Definimos la calidad de la imagen final
$cal=90;

//Se crea la imagen final en el directorio indicado
imagejpeg($lienzo,"./images/thumb.jpg",$cal);

Todo el cálculo, por otra parte, es necesario sólo si quieres mantener la proporción, si no la cosa queda más sencilla:

//Ruta de la original
$rtOriginal="/images/example.jpg";
	
//Crear variable de imagen a partir de la original
$original = imagecreatefromjpeg($rtOriginal);
	
//Definir tamaño máximo y mínimo
$ancho_final = 150;
$alto_final = 150;

//Recoger ancho y alto de la original
list($ancho,$alto)=getimagesize($rtOriginal);

$lienzo=imagecreatetruecolor($ancho_final,$alto_final);	

//Copiar $original sobre la imagen que acabamos de crear en blanco ($tmp)
imagecopyresampled($lienzo,$original,0,0,0,0,$ancho_final, $alto_final,$ancho,$alto);

//Limpiar memoria
imagedestroy($original);

//Definimos la calidad de la imagen final
$cal=90;

//Se crea la imagen final en el directorio indicado
imagejpeg($lienzo,"./images/thumb.jpg",$cal);

Esto para imágenes jpg. Para png la diferencia sería usar imagepng() para crear, y para gif imagegif(). En la web de php puedes investigar más sobre la librería GD y sacarle todo el jugo.

Anuncios

9 comentarios en “Redimensionar imágenes en PHP

  1. Memo

    En una foto vertical tomada desde el celular php al redimensionar me rota la imagen, esto solo lo hace cuando es vertical la foto. Tienen alguna idea por qué lo hace?

    Gracias por el aporte

  2. Maximiliano

    Hola tenia una consulta. Seguramente no me esta andando por algo en la configuracion. En el phpinfo tengo
    enabled el GD. Yo no se si es por que al utilizar el GD tenes que poner el path destino y final desde alguna ubicacion que este en el php.ini o es que el path lo pones directamente desde el archivo php creado.
    Por otra parte quizas tambien tenga que ver que las imagenes que estoy intentando de subir pensan mas de 9 mb. Si me puede ayudar un poco. El servidor que estoy utilizando es Dattatec.
    Muchas Gracias.

  3. Muchas gracias, funciona perfecto, hacía tiempo que le daba vueltas a ésto y me daba pereza ponerme. Ahora me pondré a aplicarlo a menudo, buen aporte

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s