jueves, 24 de marzo de 2011

Procesar imágenes que suben a nuestra web con PHP

Saludos hace varios días andaba buscando algo que me sirviera para hacer las imágenes que suben a mi web livianas para que el navegador no le tome un siglo cargarlas cuando los usuarios abren sus perfiles... después de tanto buscar supe que la librería GD de php me lo permite, el problema resulto ser.. ¿como se hace? una vez pase por decenas de foros consulte muchas veces el manual de php no lograba resolver mi problema, entonces fue cuando decidí poner en practica todo lo leído y crear mis propios functions que me permitieran hacer las redimensiones y al tiempo hacer mis imágenes livianas con lo que logre que imágenes que antes pesaban 2 o 3 megas llegaran a pesar tan solo 60 o menos kb... sin mas preámbulos el código.


public function CalcularOrientacion($ancho,$alto){
        if($ancho >= $alto){//compruebo mayor de los valores alto o ancho
            $ref=array($ancho,$alto);
        }
        else
        {
            $ref=array($alto,$ancho);
        }
        return $ref;
    }

    public function CalcularRatio($ancho, $alto, $tope){

        $ref = $this->CalcularOrientacion($ancho, $alto);
        if($ref[0] <= $tope){
            $nuevoTamano = $ref;
        }else
        {
             $difTamano = $ref[0] - $tope;
             $facConversion = $difTamano /$ref[0];
             $tamDos = intval($ref[1]-($ref[1]*$facConversion));

             if($ref[0] == $ancho){
                 $nuevoTamano = array($tope,$tamDos);
             }else
             {
                 $nuevoTamano = array($tamDos,$tope);
             }
        }

        return $nuevoTamano;

    }

    function ProcesarImagen($nombre_archivo,$destino,$tope){
        ini_set("memory_limit","256M");
        // Archivo y nuevo tamaño
        $foto = getimagesize($nombre_archivo);
        $foto_nt = $this->CalcularRatio($foto[0], $foto[1], $tope);

//obtener extencion
        $ext_temp = split("/", $foto['mime']);
        $ext = $ext_temp[count($ext_temp)-1];

        // Tipo de contenido
        //header('Content-type: image/jpeg');

        // Obtener nuevos tamaños
        list($ancho, $alto) = getimagesize($nombre_archivo);
        $nuevo_ancho = $ancho * $porcentaje;
        $nuevo_alto = $alto * $porcentaje;

        // Carcgar
        $thumb = imagecreatetruecolor($foto_nt[0], $foto_nt[1]);

        if($ext == "jpg" || $ext == "JPG" || $ext == "jpeg" || $ext == "JPEG"){
        $origen = imagecreatefromjpeg($nombre_archivo);
        }

        if($ext == "png" || $ext == "PNG"){
        $origen = imagecreatefrompng($nombre_archivo);
        }

        if($ext == "gif" || $ext == "GIF"){
        $origen = imagecreatefromgif($nombre_archivo);
        }

        // Cambiar el tamaño
        imagecopyresized($thumb, $origen, 0, 0, 0, 0, $foto_nt[0], $foto_nt[1], $foto[0], $foto[1]);

        // Imprimir


        if($ext == "jpg" || $ext == "JPG" || $ext == "jpeg" || $ext == "JPEG"){
            imagejpeg($thumb,$destino);
        }

        if($ext == "png" || $ext == "PNG"){
            imagepng($thumb,$destino);
        }

        if($ext == "gif" || $ext == "GIF"){
            imagegif($thumb,$destino);
        }
    }

con la ayuda de estos tres functions se puede resolver el problema del peso de las imágenes... sirve ya lo comprobé lo estoy aplicando en mi tesis de grado.. para hacerlo funcionar hay que tener los tres en una clase o en un script recordando siempre que si se usan en un script hay que omitir el $this-> delante de los functions.

para usarlo hay que hacer algo como esto:

ProcesarImagen("mi_foto.jpg", "img/nueva_foto.jpg", 440);

esto crear la nueva imagen en el nuevo destino, 440 es el tope que tendrá la imagen en el mas grande de sus lados sea este el ancho o el largo el otro lado tomara su nuevo tamaño manteniendo la relación original de la imagen.

espero que esto les ayude créanme que hubiese querido encontrar algo como esto, me hubiese ahorrado una semana de trabajo.

No hay comentarios:

Publicar un comentario