Redimensionar una imagen con PHP (manteniendo la proporción)

 En el blog de pablotilli.com.ar encontre este post que explica muy bien la redimension de imagen con php.

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

    
    $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.

    No hay comentarios: