Etiket arşivi: image Thumbnail

Php Gd2 Class

Php gd2 ile resize(yeniden boyutlandırma), Thumbnail(küçük resim),crop (resim kesme),Rotate (resim çevirme)efects (resim efektleri) gibi işlemleri hızlandırmak için geliştirilmiş bir class

class.gd2.php

<?php

/* Errors */
define('GD2_ERROR_NOTICE', 0);
define('GD2_ERROR_ERROR', 1);

class Gd2{

var $useGdFilters;

var $imgInfos = array(
    'type' => '',
    'width' => 0,
    'height' => 0
);

var $bgColor = array(
    'red' => 255,
    'green' => 255,
    'blue' => 255
);

var $_gdIsLoaded;
var $_imgHandler;
var $_supportedTypes = array();
var $_errors = array(
    'notices' => array(),
    'errors' => array()
);

/*
* PHP 4 Constructor
*/
function Gd2($img = '', $red = 255, $green = 255, $blue = 255){
    $this->__construct($img, $red, $green, $blue);
    register_shutdown_function(array(&$this,'__destruct'));
}

/*
* PHP 5 Constructor
*/
function __construct($img = '', $red = 255, $green = 255, $blue = 255){

    if(!$this->_gdIsLoaded = extension_loaded('gd'))
        return $this->_setError('GD library is not installed in your system');
    elseif(!function_exists('imagecreatetruecolor'))
        return $this->_setError('This class require the version 2 of GD library');

    $types = imageTypes();

    if ($types & IMG_PNG){
        $this->_supportedTypes['png']['read'] = true;
        $this->_supportedTypes['png']['write'] = true;
    }

    if ($types & IMG_GIF || function_exists('imagegif')){
        $this->_supportedTypes['gif']['read'] = true;
        $this->_supportedTypes['gif']['write'] = true;
    }
    elseif (function_exists('imagecreatefromgif')){
        $this->_supportedTypes['gif']['read'] = true;
        $this->_supportedTypes['gif']['write'] = false;
    }

    if ($types & IMG_JPG){
        $this->_supportedTypes['jpeg']['read'] = true;
        $this->_supportedTypes['jpeg']['write'] = true;
    }

    $this->bgColor['red'] = min(255,max(0,$red));
    $this->bgColor['green'] = min(255,max(0,$green));
    $this->bgColor['blue'] = min(255,max(0,$blue));

    $this->useGdFilters = function_exists('imagefilter');

    if(is_file($img))
        $this->createFromFile($img);
}

/*
* Destructor
*/
function __destruct(){
    $this->destroy();
}

/************************************ Publics Methods ************************************/

/*
* Image resource destroyer
*
* @return bool
* @access public
*/
function destroy(){
    if(is_resource($this->_imgHandler)){
        imagedestroy($this->_imgHandler);
        return true;
    }
    return false;
}

/*
* Image resource destroyer
*
* @param string $file the file path
*
* @return bool
* @access public
*/
function createFromFile($file){
    if(!$this->_gdIsLoaded)
        return false;
    elseif(!is_file($file))
        return $this->_setError('Hata! Gorsel Bulunamadi.');

    $this->_init();

    $ext = $this->getExt($file);

    if(!$this->_isSupported($ext,'read'))
        return $this->_setError('Image "'.$ext.'" are not supported');

    if ($ext === 'jpeg')
        $this->_imgHandler = @imagecreatefromjpeg($file);
    elseif($ext === 'png')
        $this->_imgHandler = @imagecreatefrompng($file);
    elseif($ext === 'gif')
        $this->_imgHandler = @imagecreatefromgif($file);

    if(!$this->_imgHandler)
        return $this->_setError('Fail to create the image resource');

    $this->imgInfos['type'] = $ext;
    $this->imgInfos['width'] = imagesx($this->_imgHandler);
    $this->imgInfos['height'] = imagesy($this->_imgHandler);

    return true;
}

/*
* Resize the image to the specified dimensions
*
* @param int $new_width the image width
* @param int $new_height the image height
* @param int $x vertical offset for crop resizing
* @param int $y horizontal offset for crop resizing
* @param int $size image dimensions for crop resizing
*
* @return bool
* @access public
*/
function CreateLogo($pic_file, $logo_file){
    $this->img_pic = imagecreatefromjpeg($pic_file);
    $this->img_logo = imagecreatefrompng($logo_file);
}
function setAlign($align) {
    if ($align =="TL") {
        $this->dpy = 5;
        $this->dpx = 5;
    } elseif ($align =="TR") {
        $this->dpy = 5;
        $this->dpx = imagesx($this->img_pic)-(imagesx($this->img_logo)+5);
    } elseif ($align =="BR") {
        $this->dpy = imagesy($this->img_pic)-(imagesy($this->img_logo)+5);
        $this->dpx = imagesx($this->img_pic)-(imagesx($this->img_logo)+5);
    } elseif ($align =="BL") {
        $this->dpy = imagesy($this->img_pic)-(imagesy($this->img_logo)+5);
        $this->dpx = 5;
    } elseif ($align =="BC") {
        $this->dpy = imagesy($this->img_pic)-(imagesy($this->img_logo)+5);
        $dc = imagesx($this->img_pic)/2;
        $dc2 = imagesx($this->img_logo)/2;
        $this->dpx = $dc-$dc2;
    } elseif ($align =="TC") {
        $this->dpy = 5;
        $dc = imagesx($this->img_pic)/2;
        $dc2 = imagesx($this->img_logo)/2;
        $this->dpx = $dc-$dc2;
    } else {
        $this->dpy = 5;
        $this->dpx = 5;
    }

}
function AddLogo($align){

    $this->setAlign($align);
    $sx = imagesx($this->img_logo);
    $sy = imagesy($this->img_logo);

    imagecopy($this->img_pic, $this->img_logo, $this->dpx, $this->dpy, 0, 0, $sx, $sy);
}
function resizeImage( $new_width, $new_height, $x = 0, $y = 0,$size = 0){
    if($this->_isReady()){
        $image_p = imagecreatetruecolor($new_width, $new_height);
        imagecopyresampled($image_p, $this->_imgHandler, 0, 0,0,0, $new_width, $new_height, $this->imgInfos['width'], $this->imgInfos['height']);
        imagedestroy($this->_imgHandler);
        $this->_imgHandler = $image_p;

            if(!empty($size)){
                $image2 = imagecreatetruecolor($size,$size);
                imagecopyresampled($image2,$this->_imgHandler,$x,$y,0,0,$size,$size,$size,$size);
                imagedestroy($this->_imgHandler);
                $this->_imgHandler = $image2;
            }

        return true;
    }
    else return false;
}

/*
* Resize the image to the specified dimensions
*
* @param int $new_width the image width
* @param int $new_height the image height
* @param int $x vertical offset for crop resizing
* @param int $y horizontal offset for crop resizing
* @param int $size image dimensions for crop resizing
*
* @return bool
* @access public
*/
function oneSizeThumbnail($size){
    if($this->_isReady()){
        if($this->imgInfos['width'] > $this->imgInfos['height']){
            $size_percent = (int)($size / ($this->imgInfos['width'] / 100));
            $new_height = (int) ($size_percent * ($this->imgInfos['height']/100));
            $new_width = $size;
            $y = ((int)$size - (int)$new_height) /2 ;
            $x = 0;
        }else{
            $size_percent = (int)($size / ($this->imgInfos['height'] / 100));
            $new_width = (int) ($size_percent * ($this->imgInfos['width']/100));
            $new_height = $size;
            $x = ($size - $new_width) / 2;
            $y = 0;
        }
        return $this->resizeImage($new_width,$new_height,$x,$y,$size);
    }
    else return false;
}

/*
* Resize the image to the specified dimensions
*
* @param int $new_width the image width
* @param int $new_height the image height
* @param int $x vertical offset for crop resizing
* @param int $y horizontal offset for crop resizing
* @param int $size image dimensions for crop resizing
*
* @return bool
* @access public
*/
function maxSizeThumbnail($size){
    if($this->_isReady()){
        if($this->imgInfos['width'] > $this->imgInfos['height']){
            $size_percent = (int)($size / ($this->imgInfos['width'] / 100));
            $new_height = (int) ($size_percent * ($this->imgInfos['height']/100));
            $new_width = $size;
            $y = ($size - $new_height) / 2;
            $x = 0;
        }else{
            $size_percent = (int)($size / ($this->imgInfos['height'] / 100));
            $new_width = (int) ($size_percent * ($this->imgInfos['width']/100));
            $new_height = $size;
            $x = ($size - $new_width) / 2;
            $y = 0;
        }

        return $this->resizeImage($new_width,$new_height,$x,$y);
    }
    else return false;
}

/*
* Crop the image to the specified dimensions
*
* @param int $width the croped image width
* @param int $height the croped image height
* @param int $x vertical offset for croping
* @param int $y horizontal offset for croping
*
* @return bool
* @access public
*/
function cropImage($width,$height,$x,$y){
    if($this->_isReady()){
        $image2 = imagecreatetruecolor($width, $height);
        imagecopymerge($image2,$this->_imgHandler,0,0,$x,$y,$width, $height,100);
        imagedestroy($this->_imgHandler);
        $this->_imgHandler = $image2;

        return true;
    }else return false;
}

/*
* Apply rotation to the image
*
* @param int $anle the rotation angle
* @param int $color the background color for some rotation
*
* @return bool
* @access public
*/
function imageRotate($angle,$color = 0){
    if($this->_isReady()){
        if(!is_numeric($angle))
            return $this->_setError('Invalid "angle" parameter');
        elseif(empty($angle) || $angle === 360)
            return true;

    if(empty($color))
        $color = imagecolorat($this->_imgHandler,0,0);
    elseif(!is_array($color))
        $color = $this->_hex2rgb($color);

    $this->_imgHandler = imagerotate($this->_imgHandler, $angle, imageColorAllocate($this->_imgHandler,$color['red'],$color['green'],$color['blue']));
    }else return false;
}

/*
* Reverse the image
*
* @return bool
* @access public
*/
function mirror(){
    if($this->_isReady()){
    $tmpimage = imagecreatetruecolor($this->imgInfos['width'], $this->imgInfos['height']);

    for ($x=0;$x<$this->imgInfos['width'];++$x)
        imagecopy($tmpimage,$this->_imgHandler, $x, 0, $this->imgInfos['width'] - $x - 1, 0, 1, $this->imgInfos['height']);

    imagedestroy($this->_imgHandler);
    $this->_imgHandler = $tmpimage;

    return true;
    }
return false;
}

/*
* Apply Negate filter to the image
*
* @return bool
* @access public
*/
function effectNegate(){
    if($this->useGdFilters){
        if($this->_isReady())
            return imagefilter($this->_imgHandler, IMG_FILTER_NEGATE);
        else
        return false;
    }else return $this->_setError('Image filters is not available on PHP4');
}

/*
* Apply Colorize filter to the image
*
* @param string | array $color the color of the filter
*
* @return bool
* @access public
*/
function effectColorize($color){
    if($this->useGdFilters){
        if($this->_isReady()){
            if(!is_array($color))
                $color = $this->_hex2rgb($color);

            return imagefilter($this->_imgHandler,IMG_FILTER_COLORIZE,$color['red'],$color['green'],$color['blue']);
        }else return false;
    }else return $this->_setError('Image filters is not available on PHP4');
}

/*
* Apply Grayscale filter to the image
*
* @return bool
* @access public
*/
function effectGrayscale(){
    if($this->useGdFilters){
        if($this->_isReady())
            return imagefilter($this->_imgHandler, IMG_FILTER_GRAYSCALE);
        else
            return false;
    }else return $this->_setError('Image filters is not available on PHP4');
}

/*
* Apply Edge Detect filter to the image
*
* @return bool
* @access public
*/
function effectEdgeDetect(){
    if($this->useGdFilters){
        if($this->_isReady())
            return imagefilter($this->_imgHandler, IMG_FILTER_EDGEDETECT);
        else
            return false;
    }else return $this->_setError('Image filters is not available on PHP4');
}

/*
* Apply Selective Blur filter to the image
*
* @return bool
* @access public
*/
function effectSelectiveBlur(){
    if($this->useGdFilters){
        if($this->_isReady())
            return imagefilter($this->_imgHandler, IMG_FILTER_SELECTIVE_BLUR);
        else
            return false;
    }
    else return $this->_setError('Image filters is not available on PHP4');
}

/*
* Apply Contrast filter to the image
*
* @param int $val the effect level
*
* @return bool
* @access public
*/
function effectContrast($val){

    if($this->useGdFilters){
        if($this->_isReady()){
            return imagefilter($this->_imgHandler, IMG_FILTER_CONTRAST,$val);
        }
        else return false;
    }
    else return $this->_setError('Image filters is not available on PHP4');
}

/*
* Apply Brightness filter to the image
*
* @param int $val the effect level
*
* @return bool
* @access public
*/
function effectBrightness($val){
    if($this->useGdFilters){
        if($this->_isReady())
            return imagefilter($this->_imgHandler, IMG_FILTER_BRIGHTNESS,$val);
        else
            return false;
    }
    else return $this->_setError('Image filters is not available on PHP4');
}

/*
* Apply Gausian Blur filter to the image
*
* @return bool
* @access public
*/
function effectGaussianBlur(){
    if($this->useGdFilters){
        if($this->_isReady())
            return imagefilter($this->_imgHandler, IMG_FILTER_GAUSSIAN_BLUR);
        else
            return false;
    }
    else return $this->_setError('Image filters is not available on PHP4');
}

/*
* Apply Smooth filter to the image
*
* @param int $val the effect level
*
* @return bool
* @access public
*/
function effectSmooth($val){
    if($this->useGdFilters){
        if($this->_isReady())
            return imagefilter($this->_imgHandler,IMG_FILTER_SMOOTH,$val);
        else
            return false;
    }
    else return $this->_setError('Image filters is not available on PHP4');
}

/*
* Apply Emboss filter to the image
*
* @return bool
* @access public
*/
function effectEmboss(){
    if($this->useGdFilters){
        if($this->_isReady())
            return imagefilter($this->_imgHandler,IMG_FILTER_EMBOSS);
        else
            return false;
    }
    else return $this->_setError('Image filters is not available on PHP4');
}

/*
* Apply Mean Removal filter to the image
*
* @return bool
* @access public
*/
function effectMeanRemoval(){
    if($this->useGdFilters){
        if($this->_isReady())
            return imagefilter($this->_imgHandler,IMG_FILTER_MEAN_REMOVAL);
        else
            return false;
    }
    else return $this->_setError('Image filters is not available on PHP4');
}

/*
* Apply negate filter to the image
*
* @return bool
* @access public
*/
function setTransparent($color){
    if($this->_isReady()){
        if(!is_array($color))
            $color = $this->_hex2rgb($color);

        if(!imageistruecolor($this->_imgHandler))
            $this->toTrueColor();

        imagecolortransparent($this->_imgHandler,imagecolorallocate($this->_imgHandler,$color['red'],$color['green'],$color['blue']));

    }
    else return false;
}

/*
* Convert an image with palette color to true color image
*
* @return bool
* @access public
*/
function toTrueColor(){
    if($this->_isReady()){
        if(!imageistruecolor($this->_imgHandler)){
            $img2 = imagecreatetruecolor($this->imgInfos['width'], $this->imgInfos['height']);

            imagecopymerge($img2,$this->_imgHandler,0,0,0,0,$this->imgInfos['width'],$this->imgInfos['height'],$this->imgInfos['width'],$this->imgInfos['height'],100);

            imagedestroy($this->_imgHandler);
            $this->_imgHandler = $img2;
        }
        return true;
    }
    return false;
}

/*
* set the background color for the created images
*
* @param string|array $color the color in hex or rgb (all "rgb" or "r" or "g" or "b") format
*
* @return bool
* @access public
*/
function setBgColor($color){
    if(is_string($color)){
        $this->bgColor = $this->_hex2rgb($color);
        return true;
    }elseif(is_array($color)){
        if($this->_isRgbColor($color)){
            $this->bgColor = $color;
            return true;
        }elseif(isset($color['red'])){
            $this->bgColor['red'] = $color['red'];
            return true;
        }elseif(isset($color['green'])){
            $this->bgColor['green'] = $color['green'];
            return true;
        }elseif(isset($color['blue'])){
            $this->bgColor['blue'] = $color['blue'];
            return true;
        }
        else return false;
    }
    else return false;
}

/*
* display the image
*
* @param string $type the output type
*
* @return bool
* @access public
*/
function display($type = ''){
    if($this->_isReady()){
        if($type === '') // i don't use empty because i don't remember if anyone of the IMAGETYPE_* constante have 0 for value
            $type = $this->imgInfos['type'];
        elseif(is_numeric($type))
            $type = $this->type2Ext($type);
        else{
            $type = strtolower($type);
            if($type === 'jpg')
                $type = 'jpeg';
        }

        if(!$this->_isSupported($type,'write'))
            return $this->_setError('Image "'.$type.'" not supported for output');

        header('Content-type: image/'.$type);

        if ($type === 'jpeg')
            imagejpeg($this->_imgHandler);
        elseif($type === 'png')
            imagepng($this->_imgHandler);
        elseif($type === 'gif')
            imagegif($this->_imgHandler);

    }elseif($this->isError())
        $this->_getErrorImage();
    else
    $this->_getErrorImage('No image handler found');
}

/*
* save the image
*
* @param string $filePath the save path
* @param int $quality output quality for jpeg
*
* @return bool
* @access public
*/
function save( $filePath, $quality = 100){
    if($this->_isReady()){
        if(empty($filePath))
            return $this->_setError('Can not save image file in a empty file path');

        $type = $this->getExt($filePath);

        if(!$this->_isSupported($type,'write'))
            return $this->_setError('Image "'.$type.'" not supported for output');

        if ($type === 'jpeg'){
            if(!is_numeric($quality))
                $quality = 100;
            else
                $quality = min(100,max(0,$quality));

            imagejpeg($this->_imgHandler,$filePath,$quality);
        }elseif ($type === 'png')
            imagepng($this->_imgHandler,$filePath);
        elseif ($type === 'gif')
            imagegif($this->_imgHandler, $filePath);
    }
}

/*
* convert an imagetype to the image extension string
*
* @param string $type the type of file you want get
*
* @return str on success or bool on fail
* @access public
*/
function type2Ext($type){
    if($type === IMAGETYPE_GIF)
        return 'gif';
    elseif($type === IMAGETYPE_PNG)
        return 'png';
    elseif($type === IMAGETYPE_JPEG)
        return 'jpeg';
    else
        return false;
}

/*
* Public isSupported method
*
* @param string $type the type of file you want check
* @param string|array $mode the mode you want check
*
* @return bool
* @access public
*/
function isSupported($type, $mode = 'read') {
    return $this->_isSupported(strtolower($type),(is_array($mode) ? $mode : strtolower($mode)));
}

/*
* return the file extension
*
* @param string $fileName the file name or path
*
* @return str
* @access public
*/
function getExt($fileName){
    if(empty($fileName))
        return '';
    elseif(false === ($pos = strrpos($fileName,'.')))
        return '';

    $ext = strtolower(substr($fileName,++$pos));

    if($ext === 'jpg')
        $ext = 'jpeg';

    return $ext;
}

/*
* Check if the class have an error
*
* @return bool
* @access public
*/
function isError() {
    return !empty($this->_errors['errors']);
}

/*
* Return the consigned errors
*
* @param bool $toStr returned the value on array or on string
* @param bool $html if return string the separator must be a normal line return with space or a html line break
*
*
* @return array | string
* @access public
*/
function getErrors( $toStr = false, $html = false){
    if(empty($this->_errors['errors']))
        return '';

    if(!$toStr)
        return $this->_errors['errors'];
    elseif(count($this->_errors['errors']) === 1)
        return $this->_errors['errors'][0];
    else{
        $ret = '';

        foreach($this->_errors['errors'] as $error)
            $ret .= $error.($html ? '<br />' : " \n");

        return $ret;
    }
}

/*
* Return the last consigned error
*
* @return str
* @access public
*/
function getLastError(){
    if(empty($this->_errors['errors']))
        return false;

    return $this->_errors['errors'][(count($this->_errors)-1)];
}

/************************************ Privates Methodss ************************************/

/*
* Initialise the class attributs
*
* @return void
* @access private
*/
function _init(){
    $this->destroy();
    $this->imgInfos = array();
}

/*
* Check if the class can work
*
* @return bool
* @access private
*/
function _isReady() {
    return ($this->_gdIsLoaded && !$this->isError() && is_resource($this->_imgHandler));
}

/*
* Check if an extension is supported for reading and/or writting
*
* @param string $type the type of file you want check
* @param string|array $mode the mode you want check
*
* @return bool
* @access private
*/
function _isSupported($type, $mode){
    if(!isset($this->_supportedTypes[$type]))
        return false;
    elseif(is_array($mode))
        return ($this->_supportedTypes[$type]['read'] && $this->_supportedTypes[$type]['write']);
    elseif(!isset($this->_supportedTypes[$type][$mode]))
        return false;
    else
        return $this->_supportedTypes[$type][$mode];
}

/*
* error handling
*
* @param string $msg the error message
* @param string|array $level the level of the error
*
* @return bool
* @access private
*/
function _setError( $msg, $level = GD2_ERROR_ERROR){
    $msg = trim($msg);

    if($level === GD2_ERROR_NOTICE){
        $this->_errors['notices'][] = $msg;

        return true;
    }else{
        $this->_errors['errors'][] = $msg;

        return false;
    }
}

/*
* create an image with the given error or with the consigned errors
*
* @param string $test the error message
*
* @return void
* @access private
*/
function _getErrorImage($text = ''){
    if(!$this->_gdIsLoaded){
        $this->_gdIsNotLoaded();
        return false;
    }elseif(empty($text))
        $text = $this->getErrors(true);

    $errors = explode("\n",$text);
    $nbe = count($errors);

    $width = ($this->imgInfos['width'] < 300) ? 300 : $this->imgInfos['width'];
    $height = (30*$nbe)+60;
    $finalheight = ($this->imgInfos['height'] < $height) ? $height : $this->imgInfos['height'];

    $eImg = imagecreate($width,$finalheight);
    $bg = imagecolorallocate($eImg, 255, 255, 255);
    $textcolor = imagecolorallocate($eImg, 255, 0, 0);

    for($i=0,$j=30;$i<$nbe;$i++,$j+=10)
        imagestring($eImg, 2, 30, $j, trim($errors[$i]), $textcolor);

    if($this->_isSupported('jpeg','write')){
        header("Content-type: image/jpeg");
        imagejpeg($eImg);
    }elseif($this->_isSupported('gif','write')){
        header("Content-type: image/gif");
        imagegif($eImg);
    }elseif($this->_isSupported('png','write')){
        header("Content-type: image/png");
        imagepng($eImg);
    }
}

function _gdIsNotLoaded(){
    header("Content-type: image/jpeg");
    echo base64_decode('/9j/4AAQSkZJRgABAQAAAQABAAD//gA+Q1JFQVRPUjogZ2QtanBlZyB2MS4'.
    'wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBkZWZhdWx0IHF1YWxpdHkK/9sAQwAIBgYHBgUIBwcHCQkIC'.
    'gwUDQwLCwwZEhMPFB0aHx4dGhwcICQuJyAiLCMcHCg3KSwwMTQ0NB8nOT04MjwuMzQy/9sAQwEJCQk'.
    'MCwwYDQ0YMiEcITIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyM'.
    'jIy/8AAEQgAZAEsAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALU'.
    'QAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXG'.
    'BkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5S'.
    'VlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29'.
    '/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwA'.
    'BAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDR'.
    'EVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrK'.
    'ztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A9'.
    '/ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACii'.
    'igAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAC'.
    'iiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArL1+WSLSx5UjRmW5t4WZDtbY8'.
    'yIwBHIJViMjkdQQa1KZLFHPC8M0ayRSKVdHGVYHggg9RSkrpo0pSUJxk+jRyUMcV74iTSvP1aO3tVu'.
    'g0b30isWH2YqQ6PuZcSkjeSRuI4wAN/QLqa98OaXd3D7557SKSRsAbmZAScDjqaJNA0aa3ht5NIsHg'.
    'g3eVG1shWPccnaMYGTycVo1EINO7OnEYiFSCjG+nf5/nfX03e5jaX5/2nX4Yp23Je4hM7NKsZaCJsY'.
    'LZ27mJ2ggc4GKyLfUb+4bwuLe5gglvtKkci4d3UtiBuFLbpGA3dWyAWOTgg9KmladH9q8uwtV+15+0'.
    '7YVHnZznfx83U9fU0w6LpRtFtDplmbZVKrCYF2AFgxAXGMFlB+oB7UnCVv67lRxNJSu1fbov5Wr+eu'.
    'tv8zJ0PWtV13ddRQ2cNmjQ5iYsZGEkEUhG7oCvmHBwd3TCY3HOfxfqAu/KgggmW5WKeyaVREGheeKN'.
    'SdsjthhLkMVTBU/KeQOySKONpGSNVaRtzlRgscAZPqcAD6AVXXStOR2dbC1DtIZSwhUEuWVi3TqWRD'.
    'n1UHsKThO2jHDE4dTblT000/wCDvv1+XpnSard6XeW0WrSWvkSRy/6RDG6+ZIDHsRUJJ3kNJhAWLbM'.
    'juovaLeSajoWn30yqstzbRzOEGFBZQTjPbmn31k975ai+uraMZEiQFV80HHBYqWXvypU89c4xYiijg'.
    'hSGGNY4o1CoiDCqBwAAOgq0mpeRhUnTlSVl73X8fLz6aadDDS/vYo9dIMD3EF6sUG5iqndHEVGGfG7'.
    '5wAoKBm/u7iavaNd3F3ZubsxfaI5DHIEQoVOAcMhLbSM9mYEYYHDCpk0rTo/tXl2Fqv2vP2nbCo87O'.
    'c7+Pm6nr6mpbW1t7K3S3tLeKCBM7Y4kCKuTk4A46kmiMZJjq1aUoNJa6a/JJ/j08zDm1nUYtRvDstf'.
    'sNrfwWe3DeZJ5ohGc5wu0y56HcOMLjcczUNc1Wfw1PMJoIWvtHm1C3aKNla3CqhKFt/zNiUYcbcFc7'.
    'TnA682tu2/dbxHfIsr5QfM642sfUjauD22j0ptvp9lZzTzW1pBBLcNumeKMK0h5OWIHJ5PX1NS4SfU'.
    '2p4qjCz5NVb52X+ev4bBZvIYTHPcwT3MTbZmgTYoP3gNpZip2lTye+e9U5Z508U2lvuU28llO4Ubgw'.
    'ZXiHPzbSCHHVcjBwfmIq9a2tvZW6W9pbxQQJnbHEgRVycnAHHUk019PspL6O+e0ga8jXalw0YMijng'.
    'NjIHJ/M1bTsjmjOCnJvZp9F1X4fL0OatPEOryadZTTx2Hn6hYC6gRCVCNmJdpLMA5YzAhcpgjbuOd4'.
    'Jr7Wbp9HWO8tbe4+3yQzqbd+v2eRwrxiTjGDxuYN8jhsYB6U6fZGFYTaQGJYTAqGMbRGcAoBj7p2jj'.
    'pwPSmf2Vp39nf2f8AYLX7D/z7eSvl9d33cY68/Ws/Zy6s6vrVFO8YWevRbO669lbTq9W76mHf+J3g1'.
    'S1+xmK40+SeC1dwq4Mku0ja5kBPyOj4WNgRn5hyVvaXGZbnX7aSadovtu1czvuQNBExCtnKjLMRgjG'.
    'eMVoyafZTXIuZbSB7gKqiVowWwGDAZxnAYBh7jNMTStOj+1eXYWq/a8/adsKjzs5zv4+bqevqarlle'.
    '7M3Xo+z5Yqztb8U7/n95zUGsasmheHILGFrq8u9OW4lldVlbCrGDkNLHkkyA53Z46HOQX+t6lKse8Q'.
    'WIXUbK0ltzKfN8xzDI4VwcMMOUK45AZt2Plron0XSpLGOxfTLNrONtyW7QKY1PPIXGAeT+ZqaTT7Ka'.
    '5FzLaQPcBVUStGC2AwYDOM4DAMPcZqfZzta5ssXQUubk6t+e911ttptoSyiQwuIXVJSp2M67lB7EgE'.
    'ZHtkfWubstU1O6s/D8Fn9lje90w3Mss4kl8sqIeg3ZfPmEctnvk4w3SSxRzwvDNGskUilXRxlWB4II'.
    'PUVFbafZWaxLa2kECxKyxiKMKEDEFgMDgEgE+pAq5RbehyUasIRfMrv/gNfm0/kM0q+/tPSLK/8vy/'.
    'tUEc2zdnbuUHGe+M1zQ8XzyR6dDGsBvJ7ZftS7G229w0sEW089VMzFo87uFBK5yetiijghSGGNY4o1'.
    'CoiDCqBwAAOgqjBo8S+a15PLqMkkZiL3aocRnqgVVVcHvxk4GSQBhSU2kkzSjUoRlKU43V9F9/9bmd'.
    'aa7cJrMun372oS1jnae5VTGp2LbuGwWO0BZyDkn7ucjpUXh7WdZ1uJbkpYJAnkeYuHDP5kEUjYOSF2'.
    'mQkfe3cD5cbjuLpWnJbwW6WFqsFvIJYYxCoWNwSQyjGAcknI9TUtva29ohS2t4oUOMrGgUcKFHT0VV'.
    'H0AHakoSvq9CpV6HI1GGr6/PV26X/AA6EWp3E1rp0stuIjPwsYlYAFiQAOSASSeFyuTgZXORjW/iKe'.
    'CaBdTaBIysySssTI4mXyykWzLYch3wql94UMpIOK6GWKOeF4Zo1kikUq6OMqwPBBB6iqMmjxC3htbO'.
    'eXT7SPcDBZKkauCckZ25XvyhU8k5zghyUr3RFCdFR5ai+fy76/LS3cxtO8QaleDTbiQWaWs8Nv5pAJ'.
    'XzZEVihffmNvnyqshDfKN4LgCG01fUtP0G5luLmC9vHvZYbaFYyr5+1mEnDSfMoLphcqAMKW53V0q6'.
    'VpyXEFwlharPbxiKGQQqGjQAgKpxkDBIwPU086fZM1yxtIC10oW4JjGZgBgB+PmGCRz2qVCXc2eKoX'.
    'soaXT2XRvT8d9+mxy83iDXraSzgurSC3lmZlJljBLgyQRI4VJWCgNOSRuJYR9V3cdLpV9/aekWV/wC'.
    'X5f2qCObZuzt3KDjPfGafbafZWaxLa2kECxKyxiKMKEDEFgMDgEgE+pAqWKKOCFIYY1jijUKiIMKoH'.
    'AAA6CqjGSerMa9alUglGFnfdad+mvl18tijpv2j7fq/n+b5f2tfI35xs8iLO3Pbdu6d8980aB9o/wC'.
    'Ec0v7Z5v2r7JF53nZ379g3bs85znOavJFHG0jJGqtI25yowWOAMn1OAB9AKIoo4IUhhjWOKNQqIgwq'.
    'gcAADoKpRszKdVSi1bt+CsPoooqjEKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK'.
    'KKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoooo'.
    'AKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoo'.
    'ooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigA'.
    'ooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiii'.
    'gAooooAKKKKACiiigAooooAKKKKACiiigAooooA//2Q==');
}

/*
* Check if the given color is an rgb color array
*
* @param array $color the color to test
*
* @return bool
* @access private
*/
function _isRgbColor($color){
    if(!isset($color['red'],$color['green'],$color['blue']))
        return false;

    return ($color['red'] < 255 && $color['red'] > 0 &&
    $color['green'] < 255 && $color['green'] > 0 &&
    $color['blue'] < 255 && $color['blue'] > 0);
}

/*
* convert an hex color to an rgb color array
*
* @param array $color the color to convert
*
* @return array
* @access private
*/
function _hex2rgb($hex){
    $hex = strtr($hex,'#','');

    if(strlen($hex) === 3)
        return array('red' => hexdec($color{0}.$color{0}),'green' => hexdec($color{1}.$color{1}),'blue' => hexdec($color{2}.$color{2}));
    else
        return array('red' => hexdec(substr($hex,0,2)),'green' => hexdec(substr($hex,2,2)),'blue' => hexdec(substr($hex,4,2)));
    }
}
?>

example.php

<?php

require('class.gd2.php');

$gd = new Gd2("DSC_0096.jpg");

if(isset($_GET['op']))
{
if($gd->useGdFilters)
{
switch((int)$_GET['op'])
{
case 1: $gd->resizeImage(150,150); break;
case 2: $gd->maxSizeThumbnail(150); break;
case 3: $gd->oneSizeThumbnail(150); break;
case 4: $gd->cropImage(200,200,50,50); break;
case 5: $gd->imageRotate(90); break;
case 6: $gd->mirror(); break;
case 7: $gd->effectBrightness(50); break;
case 8: $gd->effectSmooth(2); break;
case 9: $gd->effectEmboss(); break;
case 10: $gd->effectGaussianBlur(); break;
case 11: $gd->effectMeanRemoval(); break;
case 12: $gd->effectNegate(); break;
case 13: $gd->effectGrayscale(); break;
case 14: $gd->effectEdgeDetect(); break;
case 15: $gd->effectSelectiveBlur(); break;
case 16: $gd->effectContrast(-30); break;
case 17: $gd->effectColorize('#00ff00'); break;
case 18: $gd->createFromFile('DSC.jpg'); break;
}
}
else
{
switch((int)$_GET['op'])
{
case 1: $gd->resizeImage(150,150); break;
case 2: $gd->maxSizeThumbnail(150); break;
case 3: $gd->oneSizeThumbnail(150); break;
case 4: $gd->cropImage(200,200,50,50); break;
case 5: $gd->imageRotate(90); break;
case 6: $gd->mirror(); break;
case 7: $gd->createFromFile('DSC.jpg'); break;
}
}

$gd->display('png');
}
else
{
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>-[Gd2 Class Demo]-</title>
<style type="text/css">
body { background-color:#e2e2e2; }
th { background-color:#c0c0c0;text-align:center; }
img { margin-left:auto;margin-right:auto;border:none; }
table { margin-left:auto;margin-right:auto;text-align:center; }
.main { width:90%;border:1px solid #000000;padding:0px; }
.sub { width:100%;border:none; }
.cObj { width:90%;border:1px solid #000000;margin-left:auto;margin-right:auto;text-align:left; }
pre { margin-left:30%; }
.cObj th, .main th { font-size:28px; }
.sub th { font-size:16px;padding:5px; }
.sub td { padding:10px; }
</style>
</head>
<body>
<?php
$tests = array(
'',
'$gd->resizeImage(150,150);',
'$gd->maxSizeThumbnail(150);',
'$gd->oneSizeThumbnail(150);',
'$gd->cropImage(200,200,50,50);',
'$gd->imageRotate(90);',
'$gd->mirror();'
);

if($gd->useGdFilters)
{
$tests[] = '$gd->effectBrightness(50);';
$tests[] = '$gd->effectSmooth(30);';
$tests[] = '$gd->effectEmboss();';
$tests[] = '$gd->effectGaussianBlur();';
$tests[] = '$gd->effectMeanRemoval();';
$tests[] = '$gd->effectNegate();';
$tests[] = '$gd->effectGrayscale();';
$tests[] = '$gd->effectEdgeDetect();';
$tests[] = '$gd->effectSelectiveBlur();';
$tests[] = '$gd->effectContrast(-30);';
$tests[] = '$gd->effectColorize(\'#00ff00\');';
}

$tests[] = 'Error simulation';

$nb = count($tests);

echo '<table class="main">
<tr>
<th>Gd2 class demo samples</th>
</tr>
<tr>
<td>
<br />
<img src="DSC_0096.jpg" width="'.$gd->imgInfos['width'].'" height="'.$gd->imgInfos['height'].'" />
<br />
( Original Image )
</td>
</tr>
<tr>
<td>
<table class="sub">';

for($i=1;$i<$nb;$i+=2)
{
echo'<tr>
<th>'.$tests[$i].'</th><th>'.(isset($tests[$i+1]) ? $tests[$i+1] : '').'</th>
</tr>
<tr>
<td><img src="?op='.$i.'" /></td><td>'.(isset($tests[$i+1]) ? '<img src="?op='.($i+1).'" />' : '').'</td>
</tr>';
}

echo '</table>
</td>
</tr>
</table>
<table class="cObj">
<tr>
<th>Gd2 Class Object</th>
</tr>
<tr>
<td>
<br />
<pre>'.print_r($gd,true).'</pre>
</td>
</tr>
</table>
<br />
</body>
</html>';

$gd->destroy();
}
?>