<?php
/*  ****************************************************************
                    :: _image :: 
                    Image upload and manipulation class
                    
                    Version 1.1         (15 Nov 2011)
                    
                    Copyright MJDIGITAL ©2009-2011
                    Written by Mark Jackson
                    All rights reserved 
    
    Changelog
        v1.1    Fixed newName on upload
                Fixed extension replacement on upload
                Fixed padToFit is turned off when oversize is set to true
                
    
    Thanks for bug fixes/notifications to:
        Yamez - muleofyamez at yahoo     (strict image type chcking)
        Chuck - at Toucan Media Group    (image quality calculation fix
        Frank - at Advanced Virtual     (located bugs with filename replace and oversize + requesting version numbers)
    
*  ****************************************************************/

class _image {
    
// available properties (variables)    REDEFINE IN PAGE AS NEEDED
    
    // GENERIC - as in used by upload and resize functions
    
public $newName         '';            // new image name (without file extension)
    
public $returnType        'fullpath';     // specify return type - fullpath | array | bool | blob
    
public $safeRename        'true';        // rename the new file to remove unsafe characters and spaces
    
public $duplicates        'u';             // u = make unique / o = overwrite / e = error / a = abort
    
    // UPLOAD FUNCTION
    
public $uploadTo        'uploaded/';    // folder to upload to (relative to calling document)
    
    // RESIZE FUNCTION
    
public $source_file     '';            // source file to resize
    
public $newWidth         '';            // new image width - e.g. '200' = 200 pixels
    
public $newHeight         '';            // new image height - e.g. '200' = 200 pixels
    
public $namePrefix         '';            // prefix the resized file
    
public $newPath         '';            // path to save the new resized file
    
public $aspectRatio     'true';        // keep the aspect ratio - true | false
    
public $oversize         'false';        // resize to fill space - this can cause oversized images but will fill the frame created by w/h supplied - true | false
    
public $padToFit         'true';        // pad the image with the pad colour to fit the new image dimensions - true | false
    
public $upscale         'false';        // enlarge smaller images or not - true | false
    
public $setPosition        'cc';            // set position of image within its canvas - e.g. 'cc' = center x center y OR 'tr' = top right
    
public $padColour         '#FFFFFF';    // set background padding colour - '#XXXXXX' or 'transparent' (transparent requires PNG type)
    
public $padTransparent    'true';         // if uploading a GIF or PNG then set background as transparent - this overrides $padColour
    
public $newImgType        '';             // force resized image to be jpg | gif | png | wbmp - leave blank to match source type
    
public $imgQuality        '80';            // image quality 1-100 (%)
    
    
    
    // array of all generated error messages
    
public $errors = array(
        
'no-image'         => '<strong>Error:</strong> Please specify a source image - declare: $mj_Image->source_file = "path_to_your_image_here.jpg";',
        
'no-width'         => '<strong>Error:</strong> Please specify a width for the new image - declare: $mj_Image->newWidth = 100;',
        
'no-height'     => '<strong>Error:</strong> Please specify a height for the new image - declare: $mj_Image->newheight = 100;',
        
'image-exists'     => '<strong>Error:</strong> The image you specified already exists',
        
'upl-no-array'    => '<strong>Error:</strong> It appears the form did not submit a valid file - please try again.',
        
'upl-ini-max'    => '<strong>Error:</strong> The file uploaded exceeds the filesize limit set on this server',
        
'upl-maxsize'    => '<strong>Error:</strong> The file uploaded exceeds the filesize limit set for this form',
        
'upl-partial'    => '<strong>Error:</strong> The file was only partially uploaded - please try again',
        
'upl-no-file'    => '<strong>Error:</strong> No file was submitted for upload',
        
'upl-no-tmpDir'    => '<strong>Error:</strong> The temporary upload directory is missing',
        
'upl-cant-write'=> '<strong>Error:</strong> Failed to write to the temporary folder - please check the permissions',
        
'upl-ext'        => '<strong>Error:</strong> The upload was stopped due to an invalid file extension',
        
'upl-no-size'    => '<strong>Error:</strong> The file submitted for upload had a filesize of zero or was corrupt',
        
'upl-failed'    => '<strong>Error:</strong> The upload failed - the file could not be moved to the target location - please check the permissions',
        
'no-crop-width' => '<strong>Error:</strong> Please specify a crop width for the new image',
        
'no-crop-height'=> '<strong>Error:</strong> Please specify a crop height for the new image',
        
'no-crop-x'     => '<strong>Error:</strong> Please specify a crop x position for the new image',
        
'no-crop-y'        => '<strong>Error:</strong> Please specify a crop y position for the new image',
        
'crop-ext'        => '<strong>Error:</strong> The crop was stopped due to an invalid file extension',
    );
    
    
#################################################
    #                     METHODS                    #
    #################################################

    // This function runs when this class is instantiated
    
public function __construct() {
        
//echo 'newImage Constructed';
    
}

    private function 
hex2dec($_hex) {
        
$_color str_replace('#'''$_hex);
        
$_ret = array(
            
'r' => hexdec(substr($_color02)),
            
'g' => hexdec(substr($_color22)),
            
'b' => hexdec(substr($_color42))
        );
        return 
$_ret;
    }
    
    public function 
cleanUp($str) {
        
$str stripslashes($str);
        
$str str_replace(' ','_',$str);
        
$str str_replace('.JPG','.jpg',$str);
        
$str str_replace('.PNG','.png',$str);
        
$str str_replace('.GIF','.gif',$str);
        
$str preg_replace("/[^A-Za-z0-9_\-\.]/i""",$str);
        return 
$str;
    }
    
    public function 
upload($ar) {
        
// ERROR CAPTURE
        
if(!isset($ar['name'])) { $this->doDie($this->errors['upl-no-array']); exit; } 
        if(
$ar['error']!=0) { 
            switch(
$ar['error']) {
                case 
1$this->doDie($this->errors['upl-ini-max']);     exit; break;
                case 
2$this->doDie($this->errors['upl-maxsize']);     exit; break;
                case 
3$this->doDie($this->errors['upl-partial']);     exit; break;
                case 
4$this->doDie($this->errors['upl-no-file']);     exit; break;
                case 
6$this->doDie($this->errors['upl-no-tmpDir']);     exit; break;
                case 
7$this->doDie($this->errors['upl-cant-write']);     exit; break;
                case 
8$this->doDie($this->errors['upl-ext']);         exit; break;
            }
        }
        if(
$ar['size']==0) { $this->doDie($this->errors['upl-no-size']); exit; } 

        
// create variables
        
$img_name         $ar['name'];
        
$img_type         $ar['type'];
        
$img_tmp_name     $ar['tmp_name'];
        
$img_error        $ar['error'];
        
$img_size        $ar['size'];
        
        
// original extension
        
$ext substr(strrchr($img_name,'.'),1);
        
        
// rename file to safe filename
        
if($this->safeRename=='true') {
            
$imgPath str_replace(basename($img_name),"",$img_name);
            
$imgName = ($this->newName!='') ? $this->newName $img_name;
            
$imgName $this->cleanUp(basename($imgName));
            
$img_name $imgPath.$imgName;
        }
        
        
// ensure the extension is correct if the name has been altered
        
if(strrchr($img_name,'.')) { // has extension
            
$new_ext substr(strrchr($img_name,'.'),1);
            if(
$new_ext!=$ext) { 
                
$img_name str_replace($new_ext,'',$img_name).'.'.$ext// use original extension
            
}
        } else { 
// no extension
            
$img_name $img_name.'.'.$ext// add in original
        
}
        
        
// set target path
        
$target_path $this->uploadTo basename($img_name);
        
        
// Handle duplicates
        
if(file_exists($target_path)) {
            switch(
$this->duplicates) {
                case 
'o': break;
                case 
'e'$this->doDie($this->errors['image-exists']); exit;
                case 
'a': return false; break;
                default: 
// make unique
                    
$im = (strstr(basename($img_name),'.')) ? substr(basename($img_name),0,strrpos(basename($img_name),'.')) : basename($img_name);
                    
$ext str_replace($im,"",basename($img_name));
                    
$path $this->uploadTo;
                    
$i=1;
                    while(
file_exists($path.$im.$i.$ext)) {
                        
$i++;
                    }
                    
$imgName $im.$i.$ext;
                    
$imgPath str_replace(basename($img_name),"",$img_name);
                    
$img_name $imgPath.$imgName;
                    
$target_path $this->uploadTo $imgName;
            }
        }
        
        
// Make path writable // chmod file to 0777 if possible
        
if(file_exists($target_path)) {
            @
chmod($target_path0777);
        }
        
        
// Do upload / move image to target path
        
if(move_uploaded_file($img_tmp_name$target_path)) {
            
            
// add uploaded file to $this->source_file for resize function quick access
            
$this->source_file $this->uploadTo.basename($img_name);
            
            
// Return image, array or blob if required
            
switch(strtolower($this->returnType)) {
                case 
'array'
                    
$_ar = array(
                        
'image'     => basename($img_name),
                        
'path'        => $this->uploadTo,
                        
'size'        => $img_size
                    
);
                    return 
$_ar; break;
                case 
'fullpath':
                    return (
file_exists($target_path)) ? $target_path false; break;
                case 
'blob':
                    if(
file_exists($target_path)) {
                        
$fo fopen($target_path'r');
                        
$blob mysql_real_escape_string(fread($fofilesize($target_path)));
                        
fclose($fo);
                        return 
$blob; break;
                    } else { return 
false; break; }
                default:
                    return (
file_exists($target_path)) ? true false; break;
            }
        } else{
            
$this->doDie($this->errors['upl-failed']); exit;
        }
    }
    
    public function 
crop($w=false,$h=false,$x=false,$y=false) {
        
// ERROR CAPTURE
        
if(!$w) {     $this->doDie($this->errors['no-crop-width']); exit; }
        if(!
$h) {     $this->doDie($this->errors['no-crop-height']); exit; }
        if(
is_int($x)) {     $this->doDie($this->errors['no-crop-x']); exit; }
        if(
is_int($y)) {     $this->doDie($this->errors['no-crop-y']); exit; }
        
$sImage = (($this->source_file!='')&&(file_exists($this->source_file))) ? $this->source_file $this->doDie($this->errors['no-image']);
        
        
// make sure the new dimensions are numbers
        
$w = (!is_int($w)) ? intval($w) : $w;
        
$h = (!is_int($h)) ? intval($h) : $h;
        
$x = (!is_int($x)) ? intval($x) : $x;
        
$y = (!is_int($y)) ? intval($y) : $y;
        
        
// get image details
        
$image_info getimagesize($sImage);
        
        
// set source as resource
        
switch($image_info['mime']) {
            case 
'image/gif':
                if (
imagetypes() & IMG_GIF)  { // not the same as IMAGETYPE
                    
$src imagecreatefromgif($this->source_file);
                    
$this->imgType = ($this->newImgType!=='') ? $this->newImgType 'gif';
                } else {
                    
$this->doDie($this->errors['crop-ext'].' - GIF images are not supported');
                }
                break;
            case 
'image/jpeg':
                if (
imagetypes() & IMG_JPG)  {
                    
$src imagecreatefromjpeg($this->source_file) ;
                    
$this->imgType = ($this->newImgType!=='') ? $this->newImgType 'jpg';
                } else {
                    
$this->doDie($this->errors['crop-ext'].' - JPEG images are not supported');
                }
                break;
            case 
'image/png':
                if (
imagetypes() & IMG_PNG)  {
                    
$src imagecreatefrompng($this->source_file);
                    
imagealphablending($srctrue); // setting alpha blending on (we want to blend this image with the canvas)
                    
imagesavealpha($srctrue); // save alphablending setting
                    
$this->imgType = ($this->newImgType!=='') ? $this->newImgType 'png';
                } else {
                    
$this->doDie($this->errors['crop-ext'].' - PNG images are not supported');
                }
                break;
            case 
'image/wbmp':
                if (
imagetypes() & IMG_WBMP)  {
                    
$src imagecreatefromwbmp($this->source_file) ;
                    
$this->imgType = ($this->newImgType!=='') ? $this->newImgType 'wbmp';
                } else {
                    
$this->doDie($this->errors['crop-ext'].' - WBMP images are not supported');
                }
                break;
            default:
                
$this->doDie($this->errors['crop-ext'].' - '.$image_info['mime'].' files are not supported');
                break;
        }
        
        
$srcPath = (strstr($sImage,'/')) ? substr($sImage,0,strrpos($sImage,'/')+1) : '';
        
$srcName str_replace($srcPath,'',$sImage);
        
        
$path = ($this->newPath!='') ? trim($this->newPath) : trim($srcPath);
        
$path = (substr($path,strlen($path)-1,strlen($path))!='/') ? $path.'/' $path;
        
$imgName = ($this->newName!='') ? $this->newName $srcName;
        
        
$imgName = (strstr($imgName,'.')) ? substr($imgName,0,strrpos($imgName,'.')).'.'.$this->imgType 
                                          
$imgName.'.'.$this->imgType// make sure it has the correct extension
        
        
$preFix = ($this->namePrefix!='') ? $this->namePrefix '';
        
        
// if path doesn't exist then create it and chmod to 0777
        
if(!file_exists($path)) { mkdir($path0777); }
        
        
// rename file to safe filename
        
if($this->safeRename=='true') {
            
$imgName $this->cleanUp($imgName);
        }
        
        
// Handle duplicates
        
if(file_exists($path.$preFix.$imgName)) {
            switch(
$this->duplicates) {
                case 
'o': break;
                case 
'e'$this->doDie($this->errors['image-exists']); exit;
                case 
'a': return false; break;
                default: 
// make unique
                    
$im = (strstr($imgName,'.')) ? substr($imgName,0,strrpos($imgName,'.')) : $imgName;
                    
$i=1;
                    while(
file_exists($path.$im.$i.'.'.$this->imgType)) {
                        
$i++;
                    }
                    
$imgName $im.$i.'.'.$this->imgType;
            }
        }
        
        
// Source dimensions
        
$s_width imagesx($src);
        
$s_height imagesy($src);
        
        
// Create target image
        
$canvas imagecreatetruecolor($w$h);
        
        
//echo ($canvas.' - '.$src.' - '.$x.' - '.$y.' - 0 - 0 - '.$s_width.' - '.$s_height.' - '.$s_width.' - '.$s_height);
        
        // Copy image
        
imagecopyresampled($canvas$src$x$y00$s_width$s_height$s_width$s_height);
        
        
// output image
        
switch($this->imgType) {
            case 
'gif':     $newImg imagejpeg($canvas$path.$preFix.$imgName$this->imgQuality);
            case 
'png':
                
$quality = (intval($this->imgQuality) > 90) ? round(intval($this->imgQuality)/10);
                
//imagealphablending($canvas, false);
                //imagesavealpha($canvas, true);
                
$newImg imagepng($canvas$path.$preFix.$imgName,$quality);
            case 
'wbmp':     $newImg imagewbmp($canvas$path.$preFix.$imgName);
            default:         
$newImg imagejpeg($canvas$path.$preFix.$imgName$this->imgQuality);
        }
        
        
// clean up
        
imagedestroy($src);
        
imagedestroy($canvas);
        
        
// Return image, array or blob if required
        
switch(strtolower($this->returnType)) {
            case 
'array'
                
$_ar = array(
                    
'image'     => $imgName,
                    
'prefix'    => $preFix,
                    
'path'        => $path,
                    
'height'    => $h,
                    
'width'        => $w
                
);
                return 
$_ar; break;
            case 
'fullpath':
                return (
file_exists($path.$preFix.$imgName)) ? $path.$preFix.$imgName false; break;
            case 
'blob':
                if(
file_exists($path.$preFix.$imgName)) {
                    
$fo fopen($path.$preFix.$imgName'r');
                    
$blob mysql_real_escape_string(fread($fofilesize($path.$preFix.$imgName)));
                    
fclose($fo);
                    return 
$blob; break;
                } else { return 
false; break; }
            default:
                return (
file_exists($path.$preFix.$imgName)) ? true false; break;
        }
    }
    
    public function 
resize() {
        
// ERROR CAPTURE
        
if($this->newWidth=='') {     $this->doDie($this->errors['no-width']); exit; }
        if(
$this->newHeight=='') {     $this->doDie($this->errors['no-height']); exit; }
        
$sImage = (($this->source_file!='')&&(file_exists($this->source_file))) ? $this->source_file $this->doDie($this->errors['no-image']);
        
        
// make sure the new dimensions are numbers
        
$this->newWidth = (!is_int($this->newWidth)) ? intval($this->newWidth) : $this->newWidth;
        
$this->newHeight = (!is_int($this->newHeight)) ? intval($this->newHeight) : $this->newHeight;
        
        
// get image details
        
$image_info getimagesize($sImage);
        
        
// If oversize is used then turn off padToFit
        
if($this->oversize=='true') {
            
$this->padToFit 'false';
        }
        
        
// select the filetype based on file MIME
        // set source as resource
        
switch ($image_info['mime']) {
            case 
'image/gif':
                if (
imagetypes() & IMG_GIF)  { // not the same as IMAGETYPE
                    
$src imagecreatefromgif($this->source_file);
                    
$this->imgType = ($this->newImgType!=='') ? $this->newImgType 'gif';
                } else {
                    
$this->doDie($this->errors['upl-ext'].' - GIF images are not supported');
                }
                break;
            case 
'image/jpeg':
                if (
imagetypes() & IMG_JPG)  {
                    
$src imagecreatefromjpeg($this->source_file) ;
                    
$this->imgType = ($this->newImgType!=='') ? $this->newImgType 'jpg';
                } else {
                    
$this->doDie($this->errors['upl-ext'].' - JPEG images are not supported');
                }
                break;
            case 
'image/png':
                if (
imagetypes() & IMG_PNG)  {
                    
$src imagecreatefrompng($this->source_file);
                    
imagealphablending($srctrue); // setting alpha blending on (we want to blend this image with the canvas)
                    
imagesavealpha($srctrue); // save alphablending setting
                    
$this->imgType = ($this->newImgType!=='') ? $this->newImgType 'png';
                } else {
                    
$this->doDie($this->errors['upl-ext'].' - PNG images are not supported');
                }
                break;
            case 
'image/wbmp':
                if (
imagetypes() & IMG_WBMP)  {
                    
$src imagecreatefromwbmp($this->source_file) ;
                    
$this->imgType = ($this->newImgType!=='') ? $this->newImgType 'wbmp';
                } else {
                    
$this->doDie($this->errors['upl-ext'].' - WBMP images are not supported');
                }
                break;
            default:
                
$this->doDie($this->errors['upl-ext'].' - '.$image_info['mime'].' files are not supported');
                break;
        }
        
        
$srcPath = (strstr($sImage,'/')) ? substr($sImage,0,strrpos($sImage,'/')+1) : '';
        
$srcName str_replace($srcPath,'',$sImage);
        
        
        
$path = ($this->newPath!='') ? trim($this->newPath) : trim($srcPath);
        
$path = (substr($path,strlen($path)-1,strlen($path))!='/') ? $path.'/' $path;
        
$imgName = ($this->newName!='') ? $this->newName $srcName;
        
        
$imgName = (strstr($imgName,'.')) ? substr($imgName,0,strrpos($imgName,'.')).'.'.$this->imgType 
                                          
$imgName.'.'.$this->imgType// make sure it has the correct extension
        
        
$preFix = ($this->namePrefix!='') ? $this->namePrefix '';
        
        
// if path doesn't exist then create it and chmod to 0777
        
if(!file_exists($path)) { mkdir($path0777); }
        
        
// rename file to safe filename
        
if($this->safeRename=='true') {
            
$imgName $this->cleanUp($imgName);
        }
        
        
// Handle duplicates
        
if(file_exists($path.$preFix.$imgName)) {
            switch(
$this->duplicates) {
                case 
'o': break;
                case 
'e'$this->doDie($this->errors['image-exists']); exit;
                case 
'a': return false; break;
                default: 
// make unique
                    
$im = (strstr($imgName,'.')) ? substr($imgName,0,strrpos($imgName,'.')) : $imgName;
                    
$i=1;
                    while(
file_exists($path.$im.$i.'.'.$this->imgType)) {
                        
$i++;
                    }
                    
$imgName $im.$i.'.'.$this->imgType;
            }
        }
        
        
// Source dimensions
        
$s_width imagesx($src);
        
$s_height imagesy($src);
        
        
// canvas dimensions
        
$c_width $this->newWidth;
        
$c_height $this->newHeight;
        
        
// maintain the aspect ratio
        
if($this->aspectRatio=='true') {
            if(
$s_width $s_height) { 
                if(
$this->oversize=='true') { // resize to fill the frame - oversized images
                    
$resize_pc = ($this->newHeight/$s_height);
                        
$this->newWidth round($s_width*$resize_pc);
                } else {
                    
$resize_pc = ($this->newWidth/$s_width);
                    
// make sure the new dimensions fit into defined space
                    
if(round($s_height*$resize_pc)<=$this->newHeight) {
                        
$this->newHeight round($s_height*$resize_pc);
                    } else {
                        
$resize_pc = ($this->newHeight/$s_height);
                        
$this->newWidth round($s_width*$resize_pc);
                    }
                }
            } else { 
                if(
$this->oversize=='true') { // resize to fill the frame - oversized images
                    
$resize_pc = ($this->newWidth/$s_width);
                    
$this->newHeight round($s_height*$resize_pc);
                } else {
                    
$resize_pc = ($this->newHeight/$s_height);
                    
// make sure the new dimensions fit into defined space
                    
if(round($s_width*$resize_pc)<=$this->newWidth) {
                        
$this->newWidth round($s_width*$resize_pc);
                    } else {
                        
$resize_pc = ($this->newWidth/$s_width);
                        
$this->newHeight round($s_height*$resize_pc);
                    }
                }
            } 
        }
        
        if(
$this->padToFit!='true') { // if padding not required then set canvas size to new image size aspect
            
$c_width $this->newWidth;
            
$c_height $this->newHeight;
        } 
        
        if(
$this->upscale!='true'){
            
// do not upscale image
            
if(($s_width<=$this->newWidth)&&($s_height<=$this->newHeight)) {
                
$this->newWidth $s_width;
                
$this->newHeight $s_height;
            }
        }
         
        
        
// set the position of source in the canvas
        
if($this->padToFit=='true') {
            
// set positions
            
$top $left 0;
            
$right $c_width-$this->newWidth;
            
$cenX = ($c_width/2)-($this->newWidth/2);
            
$cenY = ($c_height/2)-($this->newHeight/2);
            
$bottom $c_height-$this->newHeight;
            switch(
true) {
                case (
strstr($this->setPosition,',')): // pixel x,y entered
                    
$dim explode($this->setPosition,',');
                    
$x intval(@$dim[0]);
                    
$y intval(@$dim[1]);
                    
$toPos = array('dx'=>$x,'dy'=>$y,'sx'=>0,'sy'=>0); break;
                case (
$this->setPosition=='tl'): // top left
                    
$toPos = array('dx'=>$left,'dy'=>$top,'sx'=>0,'sy'=>0); break;
                case (
$this->setPosition=='tr'): // top right
                    
$toPos = array('dx'=>$right,'dy'=>$top,'sx'=>0,'sy'=>0); break;
                case (
$this->setPosition=='tc'): // top centre
                    
$toPos = array('dx'=>$cenX,'dy'=>$top,'sx'=>0,'sy'=>0); break;
                case (
$this->setPosition=='bl'): // bottom left
                    
$toPos = array('dx'=>$left,'dy'=>$bottom,'sx'=>0,'sy'=>0); break;
                case (
$this->setPosition=='br'): // bottom right
                    
$toPos = array('dx'=>$right,'dy'=>$bottom,'sx'=>0,'sy'=>0); break;
                case (
$this->setPosition=='bc'): // bottom centre
                    
$toPos = array('dx'=>$cenX,'dy'=>$bottom,'sx'=>0,'sy'=>0); break;
                case (
$this->setPosition=='cl'): // centre left
                    
$toPos = array('dx'=>$left,'dy'=>$cenY,'sx'=>0,'sy'=>0); break;
                case (
$this->setPosition=='cr'): // centre right
                    
$toPos = array('dx'=>$right,'dy'=>$cenY,'sx'=>0,'sy'=>0); break;
                default: 
// centred horz + vert
                    
$toPos = array('dx'=>$cenX,'dy'=>$cenY,'sx'=>0,'sy'=>0); break;
            }
        } else {
            
$toPos = array('dx'=>0,'dy'=>0,'sx'=>0,'sy'=>0);
        }
        
        
// Create target image
        
$canvas imagecreatetruecolor($c_width$c_height);
        
        
// colour the canvas
        
if($this->padColour=='transparent')  {
            
$trans_colour imagecolorallocatealpha($canvas000127);
            
imagefill($canvas00$trans_colour);
            
imagealphablending($canvastrue);
            
imagesavealpha($canvastrue);
        } else {
            
$col $this->hex2dec($this->padColour);
            
$bgCol imagecolorallocate($canvas$col['r'], $col['g'], $col['b']);
            
imagefill($canvas00$bgCol);
        }

        
// Copy image
        
imagecopyresampled($canvas$src$toPos['dx'], $toPos['dy'], $toPos['sx'], $toPos['sy'], $this->newWidth$this->newHeight$s_width$s_height);
        
        
// Output
        
if($this->padColour=='transparent')  {
            switch(
$this->imgType) {
                case 
'gif'$newImg imagegif($canvas$path.$preFix.$imgName);
                default:     
                    
$quality = (intval($this->imgQuality) > 90) ? round(intval($this->imgQuality)/10);
                    
//imagealphablending($canvas, false);
                    //imagesavealpha($canvas, true);
                    
$newImg imagepng($canvas$path.$preFix.$imgName$quality);
                    
            }
        } else {
            switch(
$this->imgType) {
                case 
'gif':     $newImg imagejpeg($canvas$path.$preFix.$imgName$this->imgQuality);
                case 
'png':
                    
$quality = (intval($this->imgQuality) > 90) ? round(intval($this->imgQuality)/10);
                    
//imagealphablending($canvas, false);
                    //imagesavealpha($canvas, true);
                    
$newImg imagepng($canvas$path.$preFix.$imgName,$quality);
                case 
'wbmp':     $newImg imagewbmp($canvas$path.$preFix.$imgName);
                default:         
$newImg imagejpeg($canvas$path.$preFix.$imgName$this->imgQuality);
            }
        }
        
        
// clean up
        
imagedestroy($src);
        
imagedestroy($canvas);
        
        
// Return image, array or blob if required
        
switch(strtolower($this->returnType)) {
            case 
'array'
                
$_ar = array(
                    
'image'     => $imgName,
                    
'prefix'    => $preFix,
                    
'path'        => $path,
                    
'height'    => $c_height,
                    
'width'        => $c_width,
                    
'bgcolor'    => $this->padColour
                
);
                return 
$_ar; break;
            case 
'fullpath':
                return (
file_exists($path.$preFix.$imgName)) ? $path.$preFix.$imgName false; break;
            case 
'blob':
                if(
file_exists($path.$preFix.$imgName)) {
                    
$fo fopen($path.$preFix.$imgName'r');
                    
$blob mysql_real_escape_string(fread($fofilesize($path.$preFix.$imgName)));
                    
fclose($fo);
                    return 
$blob; break;
                } else { return 
false; break; }
            default:
                return (
file_exists($path.$preFix.$imgName)) ? true false; break;
        }
    }

    
#######################################################
    #
    #        EXTRA IMAGE METHODS
    #
    #######################################################
    
    
public function get_image_width($img) {
        if(
file_exists($img)) {
            list(
$width$height) = getimagesize($img);
            return 
$width;
        } else {
            return 
0;
        }
    }
    
    public function 
get_image_height($img) {
        if(
file_exists($img)) {
            list(
$width$height) = getimagesize($img);
            return 
$height;
        } else {
            return 
0;
        }
    }
    
    public function 
get_image_size($img) {
        if(
file_exists($img)) {
            list(
$width$height) = getimagesize($img);
            return array(
'width'=>$width,'height'=>$height);
        } else {
            return array(
'width'=>0,'height'=>0);
        }
    }
    
    public function 
doDie($msg,$file="",$line="") {                     // doDie - calls a die function with custom error
        
if (($file!='')&&($line!='')) {
        die(    
'<h4>Error:</h4>'.$msg.'<br/><br/>'.
                 
'<strong>File:</strong> '.$file.
                
' - <strong>on line:</strong> '.$line.
                
'</body></html>');
        } else {
        die(    
$msg);
        }
    }
// END OF CLASS
/*

YOU CAN DELETE EVERYTHING FROM HERE ONWARDS (although you may want to keep a closing ?>)

public $uploadTo        = 'uploaded/';
    public $source_file     = '';
    public $newWidth         = '';    
    public $newHeight         = '';
    public $newName         = '';
    public $namePrefix         = '';
    public $newPath         = '';
    public $duplicates        = 'u'; // u = make unique / o = overwrite / e = error / a = abort
    public $safeRename        = 'true';
    public $aspectRatio     = 'true';
    public $padToFit         = 'true';
    public $upscale         = 'false';
    public $setPosition        = 'cc';
    public $padColour         = '#FFFFFF';
    public $padTransparent    = 'true'; // if uploading a GIF or PNG then set background as transparent - this overrides $padColour
    public $returnType        = 'fullPath';
*/
if(isset($_FILES['image'])) {
$myImage = new _image;
$myImage->uploadTo 'testDir/';
$res $myImage->upload($_FILES['image']);
if(
$res) {
    
// RESIZE
    //$myImage->padColour = '#222222';
    
$myImage->newWidth 400;
    
$myImage->newHeight 300;
    
$i $myImage->resize();
    echo 
$i;
}
} else {
?>
<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
    <p>
        <input type="file" name="image" id="image" />
    </p>
    <p>
        <input type="submit" name="button" id="button" value="Submit" />
    </p>
</form>
<?php ?>