Comunidad de diseño web y desarrollo en internet

Script PHP para manejar imagenes

La idea de este script surge por que el contenido de imágenes lo tengo en otro servidor, para poder balancear un poco la carga. Esto me permite aprovechar un poco mas el ancho de banda y las peticiones que soporta Apache en mi servidor principal.

Este script tiene dos funciones. Por un lado mostrar la imagen que el cliente solicita, y por el otro redimensionarla en el caso de que sea requerido.

Para redimensionar las imágenes yo uso la libreria imageMagick la cual posee un comando llamado convert, con el que se puede manipular una imagen de muchas formas, la que me interesa ahora es solo la de redimensionar una imagen. Para este mismo propósito podemos usar la extensión de php GD, pero prefiero usar convert, si quieren usarla solo tienen que cambiar la linea que ejecuta el convert, por la que correspondería a GD.

Podría redimensionar una imagen, y borrar la redimensión para no ocupar espacio, pero el espacio no es algo que me preocupe y si lo es la capacidad de procesamiento, así que prefiero que la imagen redimensionada quede almacenada en mi filesystem, la próxima vez que alguien pida esa imagen, con esa resolución, no va a hacer necesario redimensionarla y me ahorro este proceso, ustedes pueden modificarlo para que siempre borre el archivo para ahorrarse el espacio si están limitados en este aspecto.

Mi directorio de imagenes se encuentra en una carpeta photos, esta contiene la carpeta originals, donde están todas las imagenes en su tamaño original. Después hay una carpeta con cada resolución que uso. En el caso de pedirle una resolucion al scripts que no tenga carpeta, este la crea y guarda las imágenes en esa nueva carpeta.

photos/
----/originals
----/100x100
----/50x50
----/10x10


El script es muy simple pero me sirvió mucho para un sitio en el cual manejo muchas imágenes de diferentes tamaños.

Código :

<?php
// Sino esta el parametro url, le devolvemos un error 404
if( ! isset( $_GET['url'])) {
    header("HTTP/1.0 404 Not Found");
    die();
}

define("PATH", "photos/");

// Limpiamos la variable con el nombre de la foto, para evitar problemas.
$img = cleanVar( $_GET['url'] );

//En el caso que el usuario quiera una resolucion especifica la tomamos del parametro resolution
$resolution = ( isset( $_GET['resolution'] )
    ? cleanVar( $_GET['resolution'] )
    : NULL
);

//Obtenemos el path de la imagen.
$image = getImage( $img, $resolution );

//Traemos el binario para mostrarlo con los headers adecuados. Mis imagenes son todas jpg.
$content = file_get_contents( $image );
header("Content-Type: image/jpeg");
// Muestra la imagen
echo $content;

function cleanVar( $var )
{
    return strip_tags(
        ereg_replace( " ", "", $var )
    );
}

function getImage( $name, $resolution = NULL )
{
    // Averiguamos que la imagen original exista.
    if( file_exists( PATH . 'originals/' . $name ) ) {
        if( $resolution != false ) {
            if( file_exists( PATH . $resolution . '/'. $name  )) {
                return PATH . $resolution . '/' . $name  ;
            }

            // Si la carpeta no existe la creamos.
            if( !file_exists( PATH . $resolution )  ) {
                mkdir( PATH . $resolution, 0755 );
            }
        
            // A partir de la imagen original creamos una con la resolucion requerida
            $src = PATH. 'originals/' . $name;
            $dest =  PATH . $resolution . '/' . $name;            
            exec("convert $src -resize $resolution $dest ");
            return PATH . $resolution . '/' . $name  ;
        }
        return PATH .'originals/'. $name;
    }
    
    // Si no existe la imagen, le devolvemos una default, esto puede devolverle un error 404 depende de lo que se necesite.
    return getImage( "without_image.jpg", $resolution );
}      


Modo de uso.


Si ingresamos la url de nuestro script, nos tiene que mostrar la siguiente imagen porque la imagen test.jpg no existe.

    http://www.s.pablo-morales.com/img.php?url=test.jpg&resolution=100x100




Pero si ingresamos aquí, os va a mostrar la imagen que queríamos.

    http://www.s.pablo-morales.com/img.php?url=peli.jpg&resolution=100x100


¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate