Redimensionar una imagen con #PHP (manteniendo la proporción) by pablotilli.com.ar

Fuente: Blog de Pablo Tilli

Para redimensionar una imagen con PHP; lo primero que tendremos que hacer, es cargar la imagen en memoria para poder trabajar con ella. Para esto, PHP nos brinda varias funciones dependiendo del formato de la imagen. Las funciones mas usadas son:

imagecreatefrompng
imagecreatefromgif
imagecreatefromjpeg

Como te habrás dado cuenta, la terminación del nombre de cada función nos dice que tipo de imagen puede manipular (png, gif, jpeg). Suponiendo que queremos cargar una imagen en formato png, escribiríamos algo como esto:

$ruta_imagen = 'imagen_de_prueba.png';
$imagen_original = imagecreatefrompng($ruta_imagen);

Como veras, simplemente necesitamos pasarle a la función imagecreatefrompng, la ruta completa al archivo que queremos cargar (el mecanismo es exactamente igual para imagecreatefromgif y imagecreatefromjpeg).
Ahora que tenemos la imagen cargada en memoria, podemos averiguar el ancho y el alto con las funciones imagex (para el acho) e imagey (para el alto):

//Obtenemos el ancho de la imagen que cargamos ($imagen_original)
$ancho_original = imagesx($imagen_original);
//Obtenemos el alto de la imagen que cargamos ($imagen_original)
$alto_original = imagesy($imagen_original);

Para que al redimensionar la imagen; ésta no se deforme, debemos mantener proporcionados el ancho y el alto que queremos para la imagen final, es decir, si queremos llevar la imagen a un ancho fijo, deberemos calcular el alto, y si lo que queremos es que el alto final sea fijo, tendremos que calcular el ancho. Veamos el código para los dos casos :

Caso 1: que el ANCHO de la imagen redimensionada sea de 250px, y el ALTO sea calculado proporcionalmente.

$ancho_final = 250;
$alto_final = ($ancho_final / $ancho_original) * $alto_original;

Caso 2: que el ALTO de la imagen redimensionada sea de 250px , y el ANCHO sea calculado proporcionalmente.

$alto_final = 250;
$ancho_final = ($alto_final / $alto_original) * $ancho_original;

Ahora que sabemos como calcular el ancho y el alto final de la imagen sin que se deforme, crearemos una “imagen vacía” en memoria, con estas dimensiones, utilizando la función imagecreatetruecolor:

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

A continuación usaremos la función imagecopyresampled para copiar la imagen desde $imagen_original hacia $imagen_redimensionada, pero con las nuevas dimensiones:

imagecopyresampled($imagen_redimensionada, $imagen_original, 0, 0, 0, 0, $ancho_final, $alto_final, $ancho_original, $alto_original);

Guardamos la nueva imagen (ya redimensionada) con la función imagepng (también existen imagegif e imagejpeg entre otras):

imagepng($imagen_redimensionada, 'imagen_redimensionada.png');

Una vez guardada la imagen redimensionada liberamos recursos destruyendo la imágenes en memoria, utilizando la función imagedestroy:

imagedestroy($imagen_original);
imagedestroy($imagen_redimensionada);

Listo, ya tenemos la imagen redimensionada y guardada en disco. En el ejemplo, la imagen la guardamos con un nombre distinto al de la original, de lo contrario sobreescribiría a ésta; según las necesidades de tu proyecto, tal vez no necesites conservar la imagen sin redimensionar, así que podrías usar el mismo nombre.

Todo el código junto

<?php
$ruta_imagen = 'imagen_de_prueba.png';

//Cargo en memoria la imagen que quiero redimensionar
$imagen_original = imagecreatefrompng($ruta_imagen);

//Obtengo el ancho de la imagen quecargue
$ancho_original = imagesx($imagen_original);

//Obtengo el alto de la imagen que cargue
$alto_original = imagesy($imagen_original);

//SI QUEREMOS UN ANCHO FINAL FIJO, calculamos el ALTO de forma proporcionada
$ancho_final = 250;

//Ancho final en pixeles
$alto_final = ($ancho_final / $ancho_original) * $alto_original;

//SI CONOCEMOS UN ALTO FINAL FIJO, calculamos el ANCHO de forma proporcionada

//Para usar este caso, comentar las dos lineas anteriores, y descomentar las dos siguientes a este comentario

/*$alto_final = 250; //Alto final en pixeles
$ancho_final = ($alto_final / $alto_original) * $ancho_original;*/

//Creo una imagen vacia, con el alto y el ancho que tendrá la imagen redimensionada
$imagen_redimensionada = imagecreatetruecolor($ancho_final, $alto_final);

//Copio la imagen original con las nuevas dimensiones a la imagen en blanco que creamos en la linea anterior
imagecopyresampled($imagen_redimensionada, $imagen_original, 0, 0, 0, 0, $ancho_final, $alto_final, $ancho_original, $alto_original);

//Guardo la imagen ya redimensionada
imagepng($imagen_redimensionada, 'imagen_redimensionada.png');

//Libero recursos, destruyendo las imágenes que estaban en memoria
imagedestroy($imagen_original);

imagedestroy($imagen_redimensionada);

?>

En otras entradas, iremos viendo como hacer mas cosas interesantes con imágenes y PHP. Si tienes alguna pregunta o sugerencia no dudes en comentarla.

Anuncios

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