Generar imágenes miniatura

Es frecuente que en ciertos prpogramas no interese mostrar una miniatura de una imagen en lugar de la imagen completa. Puede interesarnos sobre todo para disminuir el volumen de tráfico y agilizar la carga de una página.

El siguiente código permite hacer una llamada como <img src="miniatura.php?nombre=imagen.jpg?ancho=100&alto=200"> y mostraría una imágen con un ancho máximo de 100 pixel y 200 de alto cmo máximo:


<?php
// ancho y alto predeterminados
$ancho=100;
$alto=100;

$nombre=$_GET['nombre'];
$ancho=$_GET['ancho'];
$alto=$_GET['alto'];

$tipo=substr($nombre,-3);

switch ($tipo)
{
        case "jpg":
                $im1=imagecreatefromjpeg($nombre);
                break;
        case "gif": 
                $a=explode("/",$nombre);
                $a1=$a[count($a)-1];
                if (!is_file("$_SERVER[DOCUMENT_ROOT]/imagenes/tmp/$a1.jpg"))
                        passthru("/usr/bin/convert $nombre $_SERVER[DOCUMENT_ROOT]/imagenes/tmp/$a1.jpg");
                $nombre="imagenes/tmp/$a1.jpg";
                $tipo="jpg";
                $im1=imagecreatefromjpeg( "$nombre");
                //unlink($nombre);
                break;
        case "png": 
                $im1=imagecreatefrompng($nombre);
                break;
        default:
                return; /* o mostrar predeterminada
}

$tam = GetImageSize($nombre);
$ancho_imagen = $tam[0];
$alto_imagen = $tam[1];

$imagepro=$imageproph=1;
 if ($ancho_imagen > $ancho)
   $imageprop=$ancho/$ancho_imagen;
 if ($alto_imagen > $alto)
   $imageproph=$alto/$alto_imagen;
if ( $imageprop>$imageproph)
        $imagepro=$imageproph;
$imagen_hor_tam= ceil($ancho_imagen*$imageprop) ;
$imagen_ver_tam=ceil($alto_imagen*$imageprop) ;


$im=imagecreate($imagen_hor_tam, $imagen_ver_tam);
ImageInterlace($im,1);
imagecopyresized($im, $im1, 0, 0, 0, 0, $imagen_hor_tam, $imagen_ver_tam, ImageSX($im1), ImageSY($im1));


 switch ($tipo)
{
        case "jpg":
                        Header("Content-type: image/jpg");Imagejpeg($im);
                        break;
        case "png":
                        Header("Content-type: image/png");Imagepng($im);
                        break;
        default:
                        return;
}



     ImageDestroy($im);
        error_reporting($a);
?>