Código PHP:
    ##################################################################################################
# BEGIN imgResample2
# ------------------------------------------------------------------------------------------------
# DESCRIPCIÓN:
# Altera el tamaño de una imagen al subirse desde una forma ajustándola a una altura o anchura máxima,
# preservando las proporciones. Opcionalmnete puede señalarse una imagen PNG para que sirva com marca de agua
# Genera una imagen Thumbnail también.
# Acepta imágenes JPG, GIF o PNG y el resultado del proceso se copia al directorio actual como una imagen
# DEVUELVE:
# Nada
# PARÁMETROS:
# $campo    ->    string, obligatorio; nombre del campo de tipo File del que tomará los valores de la imagen a procesar
# $dir        ->    string, opcional; ruta donde se subirá el archivo. Si se deja vacío lo sube al directorio actual
# $anchura    ->    número, opcional; anchura máxima permitida para las imágenes a fullsize. Valor predeterminado es 250 px
# $anchura_thumb -> número, opcional; anchura máxima permitida para las imágenes thumbnail. Valor predeterminado es 100 px
# $watermark->    string URL a un archivo PNG, opcional; si existe, incrusta una marca de agua en el fullsize
# $watermark_thumb-> string URL a un archivo PNG, opcional; si existe, incrusta una marca de agua en el thumbnail
# $pos        ->    string, opcional, predeterminado = "L-T"; posición horizontal de la marca de agua. Valores permitidos: "L" para izquierda o "R" para derecha, "T" para arriba o "B" para abajo. Separar con un - los valores horizontales y verticales
# $wmdist    ->    número, opcional, predeterminado = 0; padding en pixeles para el Watermark
# $c1        ->    número, opcional, predeterminado = 85; calidad del jpg de la imagen grande
# $c2        ->    número, opcional, predeterminado = 90; calidad del jpg de la imagen thumbnail
#
# EJEMPLO:
# imgResample2('img1'); // copia la imagen del campo img1 al directorio actual
function imgResample2 ($campo, $dir="", $anchura=250, $anchura_thumb=100, $watermark="", $watermark_thumb="", $pos="L-T", $wmdist=0, $c1=95, $c2=97){
 
    if($_FILES[$campo]['name']!=''){
    
    //Si el campo está lleno, es decir, si se subió una foto...
 
        //crea los directorios necesarios
        if($dir!=""){
            if(!file_exists($dir)) mkdir($dir);
        }
        //asigna las variables        
        $name=$_FILES[$campo]['name'];
        $type=$_FILES[$campo]['type'];
        $image_name = $name;
        
        //Imagen original en el servidor
        $temp=$_FILES[$campo]['tmp_name'];
        
        //Objeto con el que trabajará el programa
        if($type=="image/pjpeg"){
            $img = @imagecreatefromjpeg($temp) or die("No se encuentra la imagen $image_name<br>\n");
        }
        if($_FILES[$campo]['type']=="image/gif"){
            $img = @imagecreatefromgif($temp) or die("No se encuentra la imagen $image_name<br>\n");
            $image_name = str_replace(".gif", ".jpg", $image_name);
        }
        if($_FILES[$campo]['type']=="image/x-png"){
            $img = @imagecreatefrompng($temp) or die("No se encuentra la imagen $image_name<br>\n");
            $image_name = str_replace(".png", ".jpg", $image_name);
        }
        //Para que acepte la transparencia del PNG
        imagealphablending($img, true);
        //INICIA PROCESO
            $dimensiones = getimagesize($temp); //Dimensiones originales de la imagen
            $ratio = ($dimensiones[0] / $anchura);
            $altura = round($dimensiones[1] / $ratio);
            $image = imagecreatetruecolor($anchura,$altura); //crea la nueva imagen
            $FFF = imagecolorallocate($img, 255,255,255);
            imagefill($image, 0, 0, $FFF);
            imagecopyresampled ($image, $img, 0, 0, 0, 0, $anchura, $altura, $dimensiones[0], $dimensiones[1]);//reescala
            
            //INICIA WATERMARK
            //posición horizontal y vertical del watermark:
            $pos = explode("-",$pos);
            $wmhorz=$pos[0];
            $wmvert=$pos[1];
        
            if($watermark != ''){
                $logo = imagecreatefrompng($watermark);
                $margen = $wmdist; //distancia entre el watermark y la orilla
                $logoW =imagesx($logo); //Anchura del logo
                $logoH =imagesy($logo); //Altura del logo
                switch ($wmhorz){
                    case "L":
                        $xpos=$margen;
                        break; //end L
                    case "R":
                        $xpos=$anchura-$logoW-$margen; //posición en x del wm
                        break; //end R
                } //end switch hotz
                switch ($wmvert){
                    case "T":
                        $ypos=$margen;
                        break; //end T
                    case "B":
                        $ypos=$altura-$logoH-$margen; //posición en y del wm
                        break; //end B
                } //end switch vert
                imagecopy($image, $logo, $xpos, $ypos, 0, 0, $logoW, $logoH); //Pone el logo
                imagedestroy($logo); //destruye el logo después de usarlo
            }
            //TERMINA WATERMARK
            imagejpeg($image,"$dir$image_name", $c1);//mueve la imagen al server (el segundo parámetro es la calidad)
            imagedestroy($image); //destruye image
            imagedestroy($img); //destruye la imagen "origen"
        //TERMINA IMAGEN
        
        //INICIA THUMBNAIL
        if($anchura_thumb != 0 || $anchura_thumb == $anchura || $anchura_thumb == "" || $anchura_thumb == NULL) {
            //crea los directorios necesarios
            $subdir = "small";
            if($dir!=""){
                if(!file_exists($dir.$subdir)) mkdir($dir.$subdir);
            } else {
                if(!file_exists($subdir)) mkdir($subdir);
            }
            //asigna las variables        
            $name=$_FILES[$campo]['name'];
            $type=$_FILES[$campo]['type'];
            $thumb_name = $subdir."/".$name;
            
            //Imagen original en el servidor
            $temp=$_FILES[$campo]['tmp_name'];
            
            //Objeto con el que trabajará el programa
            if($type=="image/pjpeg"){
                $img = @imagecreatefromjpeg($temp) or die("No se encuentra la imagen $image_name<br>\n");
            }
            if($_FILES[$campo]['type']=="image/gif"){
                $img = @imagecreatefromgif($temp) or die("No se encuentra la imagen $image_name<br>\n");
                $thumb_name = str_replace(".gif", ".jpg", $thumb_name);
            }
            if($_FILES[$campo]['type']=="image/x-png"){
                $img = @imagecreatefrompng($temp) or die("No se encuentra la imagen $image_name<br>\n");
                $thumb_name = str_replace(".png", ".jpg", $thumb_name);
            }
            //Para que acepte la transparencia del PNG
            imagealphablending($img, true);
            //INICIA PROCESO
                $dimensiones = getimagesize($temp); //Dimensiones originales de la imagen
                $ratio_thumb = ($dimensiones[0] / $anchura_thumb);
                $altura_thumb = round($dimensiones[1] / $ratio_thumb);
                $thumb = imagecreatetruecolor($anchura_thumb,$altura_thumb); //crea la nueva imagen
                $FFF = imagecolorallocate($img, 255,255,255);
                imagefill($thumb, 0, 0, $FFF);
                imagecopyresampled ($thumb, $img, 0, 0, 0, 0, $anchura_thumb, $altura_thumb, $dimensiones[0], $dimensiones[1]);//reescala el thumbnail
                //INICIA WATERMARK THUMB
                if($watermark_thumb != ''){
                    $logo_thumb = imagecreatefrompng($watermark_thumb);
                    $margen = $wmdist; //distancia entre el watermark y la orilla
                    $logoW_thumb =imagesx($logo_thumb); //Anchura del logo
                    $logoH_thumb =imagesy($logo_thumb); //Altura del logo
                    switch ($wmhorz){
                        case "L":
                            $xposThumb=$margen/2;
                            break; //end L
                        case "R":
                            $xposThumb=$anchura_thumb-$logoW_thumb-($margen/2); //posición en x del wm
                            break; //end R
                    } //end switch hotz
                    switch ($wmvert){
                        case "T":
                            $yposThumb=$margen/2;
                            break; //end T
                        case "B":
                            $yposThumb=$altura_thumb-$logoH_thumb-($margen/2); //posición en y del wm
                            break; //end B
                    } //end switch vert
                    imagecopy($thumb, $logo_thumb, $xposThumb, $yposThumb, 0, 0, $logoW_thumb, $logoH_thumb); //Pone el logo
                    imagedestroy($logo_thumb); //destruye el logo después de usarlo
                }
                //TERMINA WATERMARK THUMB
                imagejpeg($thumb,"$dir$thumb_name", $c2);//mueve la imagen al server (el segundo parámetro es la calidad)
                imagedestroy($thumb); //destruye thumb
                imagedestroy($img); //destruye la imagen "origen"
                
            } else {
            
                $thumb_name = $image_name;
            
            } // end if != 0
            
        //TERMINA THUMBNAIL
    }
    $unique = time();
    
    $resampled[0] = $dir.$image_name;
    $resampled[1] = $dir.$thumb_name;
    $resampled[2] = "<img src=\"$dir$image_name?i=$unique\">";
    $resampled[3] = "<img src=\"$dir$thumb_name?i=$unique\">";
    
    return $resampled;
    
} 
?>