[thelist] PHP GD library

Brian Cummiskey Brian at hondaswap.com
Tue Dec 9 01:23:57 CST 2003


upgrade to GD 2.0.  you really need it

here's a couple functions i use for a thumb generator for jpg only.


// form  //
<form action="handeler.php" encType="multipart/form-data" method="post" 
name="sendform">
<input name="MAX_FILE_SIZE" type="hidden" value="1000000">
<input name="image" type="file"   accept="image/jpeg, image/jpg">
<input type="submit">

// handler  //

#############################################################################################
$IMG_ORG_HEIGHT    = "*";    #Width of original image stored on server
$IMG_ORG_WIDTH  = "*";    #Height of original image stored on server
                        #set to "*" to prevent resizing on the dimension
                        #you will not lost X to Y ratio
                       
$IMG_HEIGHT = "60";           # Accepted height of resized image
$IMG_WIDTH  = "80";       # Accepted width of resized image
                        # read about "*" above

$IMG_ROOT = "./images";        # Relative path to folder where uploaded 
images will be stored; no ending slash!
            # Like this: $IMG_ROOT = "./img";   
            # Remeber to set proper attributes to that folder. 777 will 
work :)
$use_imagecreatetruecolor = true; // these flags enble 
ImageCreateTrueColor(); ImageCopyResampled();
$use_imagecopyresampled      = true;
$JPG_QUALITY    =    80; // output jpeg quality

#############################################################################################

if(!$HTTP_POST_FILES ["image"]["tmp_name"] || $HTTP_POST_FILES 
["image"]["tmp_name"] =="none") die("Your images may be no larger than 
100KB in size.  Please make it smaller, and try again.");

if( ! $f_org = 
resizer_main("image","",$IMG_ORG_WIDTH,$IMG_ORG_HEIGHT))die("<br><font 
color=\"red\"><b>No Image received...</b></font><br>");
if( ! $f_res = 
resizer_main("image","res_",$IMG_WIDTH,$IMG_HEIGHT))die("<br><font 
color=\"red\"><b>Not resized :( </b></font><br>");


$sz_org =getimagesize( "$IMG_ROOT/$f_org" );
$sz_res =getimagesize( "$IMG_ROOT/$f_res" );
$fs_org= filesize("$IMG_ROOT/$f_org" );
$fs_res= filesize("$IMG_ROOT/$f_res" );

$html =<<< EHTML

// put what you want to echo out after upload here....  may include your 
template....
// ie:

<b>Resized image:</b>  <img src="$IMG_ROOT/$f_res" $sz_res[3]>
<b>Original image:</b> <img src="$IMG_ROOT/$f_org" $sz_org[3]>

EHTML;

echo $html;

// and now, the functions....  probably include these remotely

#############################################################################################

function resizer_main($image, $dest_file_prefix,$w, $h){
//image_name = uploaded image. Name or your file field in your form.
//w,h - width and height to fit image in
global $use_imagecreatetruecolor, $use_imagecopyresampled, $IMG_ROOT, 
$JPG_QUALITY, $HTTP_POST_FILES;
$image_name = $HTTP_POST_FILES [$image]["name"];
$image = $HTTP_POST_FILES [$image]["tmp_name"];

if(trim($image) == "" || trim($image) =="none") return false;

    $arr_img = image_from_upload($image);
    if( $arr_img["w"] != $w && $arr_img["h"] != $h){
        $wh    = get_sizes($arr_img["w"], $arr_img["h"], $w, $h);
        $img_res = img_get_resized(
            $arr_img["img"],
            $arr_img["w"],    $arr_img["h"],
            $wh["w"],        $wh["h"],
            $use_imagecreatetruecolor,
            $use_imagecopyresampled);
    } else {
            //wow it is exactly like needed!!!
            $img_res = $arr_img["img"];
    }
    $file_name = make_filename($image_name, $dest_file_prefix);

    ImageJPEG($img_res,"$IMG_ROOT/$dest_file_prefix$file_name", 
$JPG_QUALITY);

    return "$dest_file_prefix$file_name";
}

function image_from_upload($uploaded_file){

    $img_sz =  getimagesize( $uploaded_file );     ## returns array with 
some properties like dimensions and type;
    ####### Now create original image from uploaded file. Be carefull! 
GIF is often not supported, as far as I remember from GD 1.6-2.0
    switch( $img_sz[2] ){
        case 1:
            $img_type = "GIF";
            //$img = ImageCreateFromGif($uploaded_file);
            die("<br><font color=\"red\"><b>Sorry, Only JPG's are 
supported.</b></font><br>");
        break;
        case 2:
            $img = ImageCreateFromJpeg($uploaded_file);
            $img_type = "JPG";
        break;
        case 3:
            $img = ImageCreateFromPng($uploaded_file);
            $img_type = "PNG";
        break;
        case 4:
           
            $img_type = "SWF";
            //$img = ImageCreateFromSwf($uploaded_file);
            die("<br><font color=\"red\"><b>Sorry, Only JPG's are 
supported.</b></font><br>");

        break;
        default: die("<br><font color=\"red\"><b>Sorry, Only JPG's are 
supported.</b></font><br>");
    }//case
    return array("img"=>$img, "w"=>$img_sz[0], "h"=>$img_sz[1], 
"type"=>$img_sz[2], "html"=>$img_sz[3]);

}


function get_sizes($src_w, $src_h, $dst_w,$dst_h ){
    //src_w ,src_h-- start width and height
    //dst_w ,dst_h-- end width and height
    //return array  w=>new width h=>new height mlt => multiplier
    //the function tries to shrink or enalrge src_w,h in such a way to 
best fit them into dst_w,h
    //keeping x to y ratio unchanged
    //dst_w or/and dst_h can be "*" in this means that we dont care 
about that dimension
    //for example if dst_w="*" then we will try to resize by height not 
caring about width
    //(but resizing width in such a way to keep the xy ratio)
    //if both = "*" we dont resize at all.
    #### Calculate multipliers
    $mlt_w = $dst_w / $src_w;
    $mlt_h = $dst_h / $src_h;

    $mlt = $mlt_w < $mlt_h ? $mlt_w:$mlt_h;
    if($dst_w == "*") $mlt = $mlt_h;
    if($dst_h == "*") $mlt = $mlt_w;
    if($dst_w == "*" && $dst_h == "*") $mlt=1;

    #### Calculate new dimensions
    $img_new_w =  round($src_w * $mlt);
    $img_new_h =  round($src_h * $mlt);
    return array("w" => $img_new_w, "h" => $img_new_h, "mlt_w"=>$mlt_w, 
"mlt_h"=>$mlt_h,  "mlt"=>$mlt);
}

function 
img_get_resized($img_original,$img_w,$img_h,$img_new_w,$img_new_h,$use_imagecreatetruecolor=false, 
$use_imagecopyresampled=false){

    //$img_original, -- image to be resized
    //$img_w, -- its width
    //$img_h, -- its height
    //$img_new_w, -- resized width
    //$img_new_h -- height
    //$use_imagecreatetruecolor, $use_imagecopyresampled allow use of 
these function
    //if they exist on the server

    if( $use_imagecreatetruecolor && 
function_exists("imagecreatetruecolor")){
//        echo("Using ImageCreateTruecolor (better quality)<br>");
        $img_resized = imagecreatetruecolor($img_new_w,$img_new_h) or 
die("<br><font color=\"red\"><b>Failed to create destination 
image.</b></font><br>");
    } else {
//        echo("Using ImageCreate (usual quality)<br>");
        $img_resized = imagecreate($img_new_w,$img_new_h) or 
die("<br><font color=\"red\"><b>Failed to create destination 
image.</b></font><br>");

    }
    if($use_imagecopyresampled && function_exists("imagecopyresampled")){
//        echo("Using ImageCopyResampled (better quality)<br>");
        imagecopyresampled($img_resized, $img_original, 0, 0, 0, 
0,$img_new_w, $img_new_h, $img_w,$img_h) or die("<br><font 
color=\"red\"><b>Failed to resize @ ImageCopyResampled()</b></font><br>");

    }else{
//        echo("Using ImageCopyResized (usual quality)<br>");
        imagecopyresized($img_resized, $img_original, 0, 0, 0, 
0,$img_new_w, $img_new_h, $img_w,$img_h) or die("<br><font 
color=\"red\"><b>Failed to resize @ ImageCopyResized()</b></font><br>");
    }
    return $img_resized;
}

function make_filename($image_name){

    ## creates unique name, here I assume that it will never happen that 
in same second
    ## two files with same name on user's site will be uploaded. However 
you can use your
    ## ways to generate unique name. Function unqueid() for example.

    //$file_name = time()."_$image_name"; 
    $file_name = uniqid('s').'.jpg';

    #kick the original extension
    $pos = strrpos($file_name, '.');
    //gif sin't supported, so hardcode jpg extention
    $file_name = substr($file_name, 0,$pos).".jpg";
    return $file_name;
}


More information about the thelist mailing list