Пример #1
0
 private function getCreateImage()
 {
     $this->image = imageCreate($this->width, $this->height);
     $back = imageColorAllocate($this->image, 255, 255, 255);
     $border = imagecolorallocate($this->image, 0, 0, 0);
     imageRectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $border);
 }
Пример #2
0
 /**
  * Make the image greyscale
  *
  * @param Asido_TMP &$tmp
  * @return boolean
  * @access protected
  */
 function __grayscale(&$tmp)
 {
     // the longer path: do it pixel by pixel
     //
     if (parent::__grayscale(&$tmp)) {
         return true;
     }
     // create 256 color palette
     //
     $palette = array();
     for ($c = 0; $c < 256; $c++) {
         $palette[$c] = imageColorAllocate($tmp->target, $c, $c, $c);
     }
     // read origonal colors pixel by pixel
     //
     for ($y = 0; $y < $tmp->image_height; $y++) {
         for ($x = 0; $x < $tmp->image_width; $x++) {
             $rgb = imageColorAt($tmp->target, $x, $y);
             $r = $rgb >> 16 & 0xff;
             $g = $rgb >> 8 & 0xff;
             $b = $rgb & 0xff;
             $gs = $r * 0.299 + $g * 0.587 + $b * 0.114;
             imageSetPixel($tmp->target, $x, $y, $palette[$gs]);
         }
     }
     return true;
 }
Пример #3
0
function setnoise($image, $width, $height, $back, $noisenum)
{
    for ($i = 0; $i < $noisenum; $i++) {
        $randColor = imageColorAllocate($image, rand(0, 255), rand(0, 255), rand(0, 255));
        imageSetPixel($image, rand(0, $width), rand(0, $height), $randColor);
    }
}
Пример #4
0
 public function createImage($text = '', $fontSize = 5)
 {
     // GD's built-in fonts are numbered from 1 - 5
     $font_size = $fontSize;
     // Calculate the appropriate image size
     $image_height = intval(imageFontHeight($font_size) * 2);
     $image_width = intval(strlen($text) * imageFontWidth($font_size) * 1.3);
     // Create the image
     $image = imageCreate($image_width, $image_height);
     // Create the colors to use in the image
     // gray background
     $back_color = imageColorAllocate($image, 216, 216, 216);
     // blue text
     $text_color = imageColorAllocate($image, 0, 0, 255);
     // black border
     $rect_color = imageColorAllocate($image, 0, 0, 0);
     // Figure out where to draw the text
     // (Centered horizontally and vertically
     $x = ($image_width - imageFontWidth($font_size) * strlen($text)) / 2;
     $y = ($image_height - imageFontHeight($font_size)) / 2;
     // Draw the text
     imageString($image, $font_size, $x, $y, $text, $text_color);
     // Draw a black border
     imageRectangle($image, 0, 0, imageSX($image) - 1, imageSY($image) - 1, $rect_color);
     // Send the image to the browser
     header('Content-Type: image/png');
     imagePNG($image);
     imageDestroy($image);
 }
Пример #5
0
 /**
  * 显示验证码
  */
 function create()
 {
     $this->image = imageCreate($this->width, $this->height);
     $this->back = $this->getColor($this->bgcolor);
     imageFilledRectangle($this->image, 0, 0, $this->width, $this->height, $this->back);
     $size = $this->width / $this->charLen - 4;
     if ($size > $this->height) {
         $size = $this->height;
     }
     $left = ($this->width - $this->charLen * ($size + $size / 10)) / $size + 5;
     $code = '';
     for ($i = 0; $i < $this->charLen; $i++) {
         $randKey = rand(0, count($this->arrChr) - 1);
         $randText = $this->arrChr[$randKey];
         $code .= $randText;
         $textColor = imageColorAllocate($this->image, rand(0, 100), rand(0, 100), rand(0, 100));
         $font = $this->fontPath . '/' . rand(1, 5) . ".ttf";
         $randsize = rand($size - $size / 10, $size + $size / 10);
         $location = $left + ($i * $size + $size / 10);
         @imagettftext($this->image, $randsize, rand(-18, 18), $location, rand($size - $size / 10, $size + $size / 10) + 2, $textColor, $font, $randText);
     }
     if ($this->showNoisePix == true) {
         $this->setNoisePix();
     }
     if ($this->showNoiseLine == true) {
         $this->setNoiseLine();
     }
     if ($this->showBorder == true) {
         $this->borderColor = $this->getColor($this->borderColor);
         imageRectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $this->borderColor);
     }
     $this->text = strtolower($code);
 }
 function createAICode()
 {
     global $bBlog;
     $code = $this->randomString();
     $bBlog->db->query("\n\tDELETE FROM `" . T_CHECKCODE . "` WHERE `timestamp`+3000<NOW()");
     $bBlog->db->query("\n\tINSERT INTO `" . T_CHECKCODE . "` ( `id` , `checksum` , `timestamp` )\n\tVALUES ('', '" . md5($code . $_SERVER["REMOTE_ADDR"]) . "', NOW( ))");
     if (!isset($plugins_dir)) {
         $plugins_dir = dirname(__FILE__) . '/';
     }
     $fontfile = "atomicclockradio.ttf";
     $font = $plugins_dir . $fontfile;
     $im = @imageCreate(110, 50) or die("Cannot Initialize new GD image stream");
     $background_color = imageColorAllocate($im, 195, 217, 255);
     $text_color = imageColorAllocate($im, 168, 18, 19);
     ImageTTFText($im, 20, 5, 18, 38, $text_color, $font, $code);
     // Date in the past
     header("Expires: Thu, 28 Aug 1997 05:00:00 GMT");
     // always modified
     $timestamp = gmdate("D, d M Y H:i:s");
     header("Last-Modified: " . $timestamp . " GMT");
     // HTTP/1.1
     header("Cache-Control: no-store, no-cache, must-revalidate");
     header("Cache-Control: post-check=0, pre-check=0", false);
     // HTTP/1.0
     header("Pragma: no-cache");
     // dump out the image
     header("Content-type: image/png");
     ImagePNG($im);
 }
Пример #7
0
 function Graph($res)
 {
     if ($res == "svga") {
         $wd = "800";
         $ht = "600";
     } elseif ($res == "xga") {
         $wd = "1024";
         $ht = "768";
     } elseif ($res == "sxga") {
         $wd = "1280";
         $ht = "1024";
     } elseif ($res == "uxga") {
         $wd = "1600";
         $ht = "1200";
     } else {
         $wd = "640";
         $ht = "480";
     }
     $this->img = imageCreate($wd, $ht);
     $this->wte = imageColorAllocate($this->img, 255, 255, 255);
     $this->blk = imageColorAllocate($this->img, 0, 0, 0);
     $this->gry = imageColorAllocate($this->img, 100, 100, 100);
     $this->red = imageColorAllocate($this->img, 150, 0, 0);
     $this->grn = imageColorAllocate($this->img, 0, 150, 0);
     $this->blu = imageColorAllocate($this->img, 0, 0, 150);
     imagestring($this->img, 2, 5, 5, $res, $this->blu);
 }
Пример #8
0
function king_def()
{
    global $king;
    header("Cache-Control: no-cache, must-revalidate");
    // HTTP/1.1
    header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
    // 过去的时间
    header("Content-type: image/png");
    $salt = kc_get('salt', 1, 1);
    $width = $king->config('verifywidth');
    //图片长度
    $height = $king->config('verifyheight');
    //图片高度
    $size = $king->config('verifysize');
    //文字大小
    $num = $king->config('verifynum');
    //文字数量
    $content = $king->config('verifycontent');
    //随机字符
    $array_content = explode('|', $content);
    $array_content = array_diff($array_content, array(null));
    $array_font = kc_f_getdir('system/verify_font', 'ttf|ttc');
    $str = '';
    $img = imageCreate($width, $height);
    //创建一个空白图像
    imageFilledRectangle($img, 0, 0, $width, $height, imagecolorallocate($img, 255, 255, 255));
    //写字
    for ($i = 0; $i < $num; $i++) {
        $code = $array_content[array_rand($array_content)];
        $str .= $code;
        //验证码字符
        $color = imageColorAllocate($img, rand(0, 128), rand(0, 128), rand(0, 128));
        $font = 'verify_font/' . $array_font[array_rand($array_font)];
        //随机读取一个字体
        $left = rand(round($size * 0.2), round($size * 0.4)) + $i * $size;
        imagettftext($img, rand(round($size * 0.7), $size), rand(-20, 20), $left, rand(round($size * 1.2), $size * 1.4), $color, $font, $code);
    }
    //画星号
    $max = $width * $height / 400;
    for ($i = 0; $i < $max; $i++) {
        imagestring($img, 15, rand(0, $width), rand(0, $height), '*', rand(192, 250));
    }
    //画点
    $max = $width * $height / 40;
    for ($i = 0; $i < $max; $i++) {
        imageSetPixel($img, rand(0, $width), rand(0, $height), rand(1, 200));
    }
    //画线
    $max = $width * $height / 800;
    for ($i = 0; $i < $max; $i++) {
        imageline($img, rand(0, $width), rand(0, $height), rand(0, $width), rand(0, $height), rand(0, 255));
    }
    //写验证码到verify中
    $verify = new KC_Verify_class();
    $verify->Put($salt, $str);
    imagePng($img);
    imageDestroy($img);
    $verify->Clear();
}
Пример #9
0
 function create($text)
 {
     $img = imagecreatefrompng("skins/icon.png");
     $black = imageColorAllocate($img, 0, 0, 0);
     $white = imageColorAllocate($img, 255, 255, 255);
     imageString($img, 5, 20, 3, $text, $white);
     imagePNG($img);
 }
Пример #10
0
 private function getCreateImage()
 {
     //用来创建图像资源,并初使化背影
     $this->image = imagecreatetruecolor($this->width, $this->height);
     $backColor = imagecolorallocate($this->image, rand(225, 255), rand(225, 255), rand(225, 255));
     //背景色(随机)
     @imagefill($this->image, 0, 0, $backColor);
     $border = imageColorAllocate($this->image, 0, 0, 0);
     imageRectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $border);
 }
Пример #11
0
function code()
{
    $fontSize = 20;
    //定义字体大小
    $length = 5;
    //定义字符串长度
    $strNum = GetVerify($length);
    //获取一个随机字符串
    $_SESSION['verify'] = $strNum;
    //付值给session
    $width = 90;
    //定义图片宽度
    $height = 30;
    //定义图片高度
    $im = imagecreate($width, $height);
    //生成一张指定宽高的图片
    $backgroundcolor = imagecolorallocate($im, 255, 255, 255);
    //生成背景色
    $frameColor = imageColorAllocate($im, 150, 150, 150);
    //生成边框色
    $font = './system/fonts/arial.ttf';
    //提取字体文件,开始写字
    for ($i = 0; $i < $length; $i++) {
        $charY = ($height + 9) / 2 + rand(-1, 1);
        //定义字符Y坐标
        $charX = $i * 15 + 8;
        //定义字符X坐标
        //生成字符颜色
        $text_color = imagecolorallocate($im, mt_rand(50, 200), mt_rand(50, 128), mt_rand(50, 200));
        $angle = rand(-20, 20);
        //生成字符角度
        //写入字符
        imageTTFText($im, $fontSize, $angle, $charX, $charY, $text_color, $font, $strNum[$i]);
    }
    for ($i = 0; $i <= 5; $i++) {
        //循环画背景线
        $linecolor = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
        $linex = mt_rand(1, $width - 1);
        $liney = mt_rand(1, $height - 1);
        imageline($im, $linex, $liney, $linex + mt_rand(0, 4) - 2, $liney + mt_rand(0, 4) - 2, $linecolor);
    }
    for ($i = 0; $i <= 32; $i++) {
        //循环画背景点,生成麻点效果
        $pointcolor = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
        imagesetpixel($im, mt_rand(1, $width - 1), mt_rand(1, $height - 1), $pointcolor);
    }
    imagerectangle($im, 0, 0, $width - 1, $height - 1, $frameColor);
    //画边框
    //ob_clean();
    //header('Content-type: image/png');
    imagepng($im);
    imagedestroy($im);
    return $strNum;
}
Пример #12
0
 function GenColors()
 {
     $colorR = rand(100, 230);
     $colorG = rand(100, 230);
     $colorB = rand(100, 230);
     $colorG2 = (rand(100, 230) + $colorG) / 2;
     $colorB2 = (rand(100, 230) + $colorB) / 2;
     $this->colorBg = imageColorAllocate($this->img, $colorR, $colorG, $colorB);
     $this->colorTxt[0] = imageColorAllocate($this->img, $colorR - 80, $colorG2 - 70, $colorB - 80);
     $this->colorTxt[1] = imageColorAllocate($this->img, $colorR - 70, $colorG - 80, $colorB2 - 70);
     $this->colorLine = imageColorAllocate($this->img, $colorR - 10, $colorG2 - 20, $colorB2 - 10);
 }
Пример #13
0
 protected function color(array $color, $image = false)
 {
     if (!is_array($image)) {
         $image = $this->map;
     }
     list($r, $g, $b) = $color;
     $colorRes = imagecolorexact($image['image'], $r, $g, $b);
     if ($colorRes == -1) {
         $colorRes = imageColorAllocate($image['image'], $r, $g, $b);
     }
     return $colorRes;
 }
Пример #14
0
function text2image($height, $text)
{
header("Content-type: image/png");
$width = $height * strlen($text)/ 5 * 2;
$font = "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf";
$image = imageCreate($width, $height);
$backgroundColor = imageColorAllocate($image, 255, 255, 255);
$textColor = imageColorAllocate($image, 0, 0, 0);
imagefttext($image, $height/2, 0, 0, $height/10*9, $textColor, $font, $text); 
imageInterlace($image, 1);
imageColorTransparent($image, $backgroundColor);
imagePNG($image);
}
Пример #15
0
 public function execute()
 {
     $cachePath = SJB_BASE_DIR . "system/cache/markers";
     if (SJB_Request::isAjax()) {
         $fileSystem = new SJB_Filesystem();
         $markers = $fileSystem->getFileNames($cachePath);
         $response = count($markers) ? json_encode($markers) : '';
         exit($response);
     }
     $grayImage = SJB_BASE_DIR . "templates/_system/main/images/marker_gray.gif";
     $greenImage = SJB_BASE_DIR . "templates/_system/main/images/marker_green.gif";
     $orangeImage = SJB_BASE_DIR . "templates/_system/main/images/marker_orange.gif";
     $blueImage = SJB_BASE_DIR . "templates/_system/main/images/marker_blue.gif";
     $pinkImage = SJB_BASE_DIR . "templates/_system/main/images/marker_pink.gif";
     $type = SJB_Request::getVar('type', 'Job');
     $text = SJB_Request::getVar('text', '');
     $filename = '';
     $assets = array('Job' => $orangeImage, 'priority' => $orangeImage, 'indeed' => $blueImage, 'simplyHired' => $greenImage, 'beyond' => $grayImage, 'Resume' => $orangeImage);
     if (array_key_exists($type, $assets)) {
         $filename = $assets[$type];
     } else {
         $filename = $grayImage;
     }
     $cacheFilename = $cachePath . "/marker_" . $type . '_' . $text . ".gif";
     $img = null;
     if (!file_exists($cacheFilename)) {
         if ($filename == $pinkImage || !empty($text) && is_string($text) && !empty($filename)) {
             $img = imagecreatefromgif($filename);
             $imageSx = imagesx($img);
             $imageSy = imagesy($img);
             $fontSize = 8;
             $textLen = strlen($text);
             $black = imageColorAllocate($img, 0, 0, 0);
             $white = imageColorAllocate($img, 255, 255, 255);
             if (!empty($text)) {
                 imagettftext($img, $fontSize, 0, $imageSx / 2 - floor($fontSize / 2 * $textLen) + 2, 13, $black, SJB_BASE_DIR . "templates/_system/main/images/arial.ttf", $text);
             }
             if (!file_exists($cachePath)) {
                 mkdir($cachePath, 0777);
             }
             imagegif($img, $cachePath . "/marker_" . $type . '_' . $text . ".gif");
         }
     } else {
         $img = imagecreatefromgif($cacheFilename);
     }
     if (!is_null($img)) {
         header("Content-type: image/gif");
         imagegif($img);
     }
     exit;
 }
Пример #16
0
function mainColor($image)
{
    $i = 0;
    for ($x = 0; $x < imagesx($image); $x++) {
        for ($y = 0; $y < imagesy($image); $y++) {
            $rgb = ImageColorAt($image, $x, $y);
            $r += $rgb >> 16 & 0xff;
            $g += $rgb >> 8 & 0xff;
            $b += $rgb & 0xff;
            $i++;
        }
    }
    return imageColorAllocate($image, $r / $i, $g / $i, $b / $i);
}
Пример #17
0
 public function renderFrame(float $t, int $width, int $height)
 {
     $image = \imageCreate($width, $height);
     $palette = [];
     foreach (self::PICO_8_PALETTE as list($red, $green, $blue)) {
         $palette[] = \imageColorAllocate($image, $red, $green, $blue);
     }
     for ($x = 0; $x < $width; $x++) {
         for ($y = 0; $y < $height; $y++) {
             $value = ($this->function)($x - $width / 2, $y - $height / 2, $t);
             \imageSetPixel($image, $x, $y, $palette[self::mod(abs(floor($value)), count($palette))]);
         }
     }
     return $image;
 }
Пример #18
0
function img($text)
{
    $img_height = 50;
    $img_width = 18;
    $img = imagecreate($img_height, $img_width);
    ImageColorAllocate($img, 255, 255, 255);
    $black = ImageColorAllocate($img, 0, 0, 0);
    for ($i = 0; $i < 10; $i++) {
        ImageString($img, 1, mt_rand(1, $img_height), mt_rand(0, $img_width), "Q", imageColorAllocate($img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255)));
    }
    ImageRectangle($img, 0, 0, $img_height - 1, $img_width - 1, $black);
    //
    Imagestring($img, 5, 5, 2, $text, imageColorAllocate($img, mt_rand(0, 100), mt_rand(0, 150), mt_rand(0, 200)));
    Imagepng($img);
    ImageDestroy($img);
}
Пример #19
0
 /**
  * Make image
  *
  */
 protected function _image()
 {
     $this->_image = imagecreate($this->config['width'], $this->config['height']);
     imageFilledRectangle($this->_image, 0, 0, $this->config['width'], $this->config['height'], $this->_color($this->config['bgColor']));
     $seed = $this->_seed();
     $fonts = $this->_fonts();
     $_SESSION[$this->config['sessionValueKey']] = $seed;
     $_SESSION[$this->config['sessionTtlKey']] = time() + $this->config['ttl'];
     for ($i = 0; $i < $this->config['length']; $i++) {
         $char = substr($seed, $i, 1);
         $x = $this->config['padding'] + $i * ($this->config['size'] + $this->config['space']);
         $y = mt_rand(0.7 * $this->config['height'], 0.9 * $this->config['height']);
         $charColor = imageColorAllocate($this->_image, mt_rand(50, 155), mt_rand(50, 155), mt_rand(50, 155));
         imagettftext($this->_image, $this->config['size'], mt_rand(-18, 18), $x, $y, $charColor, $fonts[$i], $char);
     }
     $this->_noise();
 }
Пример #20
0
 /**
  * Placeholder code adapted from dummyimage.com
  */
 public static function placeholder($width, $height)
 {
     $file_format = 'gif';
     $width = $width;
     $height = $height;
     $text_angle = 0;
     $font = Load::getModulePath('media') . 'assets/mplus-1c-medium.ttf';
     $img = imageCreate($width, $height);
     $bg_color = imageColorAllocate($img, 196, 196, 196);
     $fg_color = imageColorAllocate($img, 94, 94, 94);
     $lines = 1;
     $text = $width . 'x' . $height;
     $fontsize = max(min($width / strlen($text) * 1.15, $height * 0.5), 5);
     $textBox = self::_imagettfbbox_t($fontsize, $text_angle, $font, $text);
     $textWidth = ceil(($textBox[4] - $textBox[1]) * 1.07);
     $textHeight = ceil((abs($textBox[7]) + abs($textBox[1])) * 1);
     $textX = ceil(($width - $textWidth) / 2);
     $textY = ceil(($height - $textHeight) / 2 + $textHeight);
     imageFilledRectangle($img, 0, 0, $width, $height, $bg_color);
     imagettftext($img, $fontsize, $text_angle, $textX, $textY, $fg_color, $font, $text);
     $offset = 60 * 60 * 24 * 14;
     //14 Days
     $ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
     header($ExpStr);
     //Set a far future expire date. This keeps the image locally cached by the user for less hits to the server.
     header('Cache-Control:	max-age=120');
     header("Last-Modified: " . gmdate("D, d M Y H:i:s", time() - $offset) . " GMT");
     header('Content-type: image/' . $file_format);
     //Set the header so the browser can interpret it as an image and not a bunch of weird text.
     switch ($file_format) {
         case 'gif':
             imagegif($img);
             break;
         case 'png':
             imagepng($img);
             break;
         case 'jpg':
             imagejpeg($img);
             break;
         case 'jpeg':
             imagejpeg($img);
             break;
     }
     imageDestroy($img);
     exit;
 }
Пример #21
0
function textToImg($text, $backRGB, $strRGB, $fontPath, $fontSize, $margin)
{
    // 大きさを測定
    $result = imageTTFBBox($fontSize, 0, $fontPath, $text);
    // 幅と高さを取得
    $width = abs($result[4]) + abs($result[6]) + $margin * 2;
    $height = abs($result[1]) + abs($result[7]) + $margin * 2;
    // イメージリソースを生成
    $img = imageCreateTrueColor($width, $height);
    // 色を生成
    $backColor = imageColorAllocate($img, $backRGB['red'], $backRGB['green'], $backRGB['blue']);
    $strColor = imageColorAllocate($img, $strRGB['red'], $strRGB['green'], $strRGB['blue']);
    // 背景を塗りつぶす
    imageFilledRectangle($img, 0, 0, $width, $height, $backColor);
    // 文字を描く
    imageTTFText($img, $fontSize, 0, $margin + abs($result[0]), $margin + abs($result[7]), $strColor, $fontPath, $text);
    return $img;
}
Пример #22
0
 function FunctionGraph($x1 = 2, $y1 = 2)
 {
     $width = 800;
     $height = 600;
     $this->x0 = -$x1;
     $this->y0 = -$y1;
     $this->x1 = $x1;
     $this->y1 = $y1;
     $this->posX0 = $width / 2;
     $this->posY0 = $height / 2;
     $this->scale = (double) ($width - 20) / ($this->x1 - $this->x0);
     $this->img = imageCreate($width, $height);
     $this->wte = imageColorAllocate($this->img, 255, 255, 255);
     $this->blk = imageColorAllocate($this->img, 0, 0, 0);
     $this->gry = imageColorAllocate($this->img, 100, 100, 100);
     $this->grn = imageColorAllocate($this->img, 0, 150, 0);
     $this->blu = imageColorAllocate($this->img, 0, 0, 150);
 }
Пример #23
0
 /**
  * Create test image.
  *
  * @param string $filename
  * @return void
  */
 protected function createTestImage($filename)
 {
     $filename = $this->getFullPath($filename);
     if (!file_exists($filename)) {
         // Create an image with the specified dimensions
         $image = imageCreate(300, 200);
         // Create a color (this first call to imageColorAllocate
         //  also automatically sets the image background color)
         $colorYellow = imageColorAllocate($image, 255, 255, 0);
         // Draw a rectangle
         imageFilledRectangle($image, 50, 50, 250, 150, $colorYellow);
         $directory = dirname($filename);
         if (!file_exists($directory)) {
             mkdir($directory, 0777, true);
         }
         imageJpeg($image, $filename);
         // Release memory
         imageDestroy($image);
     }
 }
Пример #24
0
function make_img($content)
{
    $timage = array(strlen($content) * 20 + 10, 28);
    // array(largeur, hauteur) de l'image; ici la largeur est fonction du nombre de lettre du contenu, on peut bien sur mettre une largeur fixe.
    $content = preg_replace('/(\\w)/', '\\1 ', $content);
    // laisse plus d'espace entre les lettres
    $image = imagecreatetruecolor($timage[0], $timage[1]);
    // création de l'image
    // definition des couleurs
    $fond = imageColorAllocate($image, 240, 255, 240);
    $grey = imageColorAllocate($image, 210, 210, 210);
    $text_color = imageColorAllocate($image, rand(0, 100), rand(0, 50), rand(0, 60));
    imageFill($image, 0, 0, $fond);
    // on remplit l'image de blanc
    //On remplit l'image avec des polygones
    for ($i = 0, $imax = mt_rand(3, 5); $i < $imax; $i++) {
        $x = mt_rand(3, 10);
        $poly = array();
        for ($j = 0; $j < $x; $j++) {
            $poly[] = mt_rand(0, $timage[0]);
            $poly[] = mt_rand(0, $timage[1]);
        }
        imageFilledPolygon($image, $poly, $x, imageColorAllocate($image, mt_rand(150, 255), mt_rand(150, 255), mt_rand(150, 255)));
    }
    // Création des pixels gris
    for ($i = 0; $i < $timage[0] * $timage[1] / rand(15, 18); $i++) {
        imageSetPixel($image, rand(0, $timage[0]), rand(0, $timage[1]), $grey);
    }
    // affichage du texte demandé; on le centre en hauteur et largeur (à peu près ^^")
    //imageString($image, 5, ceil($timage[0]-strlen($content)*8)/2, ceil($timage[1]/2)-9, $content, $text_color);
    $longueur_chaine = strlen($content);
    for ($ch = 0; $ch < $longueur_chaine; $ch++) {
        imagettftext($image, 18, mt_rand(-30, 30), 10 * ($ch + 1), mt_rand(18, 20), $text_color, 'res/georgia.ttf', $content[$ch]);
    }
    $type = function_exists('imageJpeg') ? 'jpeg' : 'png';
    @header('Content-Type: image/' . $type);
    @header('Cache-control: no-cache, no-store');
    $type == 'png' ? imagePng($image) : imageJpeg($image);
    ImageDestroy($image);
    exit;
}
Пример #25
0
 public function getPNG()
 {
     // создаем картинку
     $image = imageCreate($this->width + $this->widthLegend, $this->height);
     $backColor = imageColorAllocate($image, $this->colorBG >> 16, ($this->colorBG >> 8) % 256, $this->colorBG % 256);
     $centerColor = imageColorAllocate($image, $this->colorCenter >> 16, ($this->colorCenter >> 8) % 256, $this->colorCenter % 256);
     $pointsColor = imageColorAllocate($image, $this->colorPoints >> 16, ($this->colorPoints >> 8) % 256, $this->colorPoints % 256);
     $legendColor = imageColorAllocate($image, $this->colorLegend >> 16, ($this->colorLegend >> 8) % 256, $this->colorLegend % 256);
     // background
     imageFilledRectangle($image, 0, 0, $this->width, $this->height, $backColor);
     imageRectangle($image, $this->width, 0, $this->widthLegend + $this->width - 1, $this->height - 1, $legendColor);
     // добавляем масштаб в легенду
     imageLine($image, $this->width + 10, $this->height - $this->fontSize * 2 - 1, $this->width + 10, $this->height - $this->fontSize * 2 + 1, $legendColor);
     imageLine($image, $this->width + 10, $this->height - $this->fontSize * 2, $this->width + 20, $this->height - $this->fontSize * 2, $legendColor);
     imageLine($image, $this->width + 20, $this->height - $this->fontSize * 2 - 1, $this->width + 20, $this->height - $this->fontSize * 2 + 1, $legendColor);
     imageTTFText($image, $this->fontSize, 0, $this->width + $this->fontSize + 20, $this->height - $this->fontSize * 1.5, $legendColor, $this->pathToFont, "{$this->metersIn10Pix} {$this->metersLabel}");
     // center
     imageFilledEllipse($image, $this->centerWidth, $this->centerHeight, $this->sizePoints, $this->sizePoints, $centerColor);
     imageTTFText($image, $this->fontSize, 0, $this->centerWidth, $this->centerHeight + $this->fontSize + $this->sizePoints, $centerColor, $this->pathToFont, "0");
     imageTTFText($image, $this->fontSize, 0, $this->width + $this->fontSize, $this->fontSize * 2, $legendColor, $this->pathToFont, "0 - {$this->centerLabel}");
     // points
     $i = 1;
     foreach ($this->pointsBased as $v) {
         $angle = $v->getPoint()->getAzimuth() - 90;
         // угол для тригонометрии
         $pointWidth = $this->centerWidth + $this->k * ($v->getPoint()->getDistance() * cos(deg2rad($angle)));
         $pointHeight = $this->centerHeight + $this->k * ($v->getPoint()->getDistance() * sin(deg2rad($angle)));
         // рисуем точку
         imageEllipse($image, $pointWidth, $pointHeight, $this->sizePoints, $this->sizePoints, $pointsColor);
         // подпись
         imageTTFText($image, $this->fontSize, 0, $pointWidth, $pointHeight + $this->fontSize + $this->sizePoints, $pointsColor, $this->pathToFont, $i);
         // в легенду
         imageTTFText($image, $this->fontSize, 0, $this->width + $this->fontSize, $this->fontSize * 2 * ($i + 1), $legendColor, $this->pathToFont, "{$i} - " . $v->getTitle());
         $i++;
     }
     ob_start();
     imagePng($image);
     $str = ob_get_clean();
     return $str;
 }
Пример #26
0
function create_image($text, $size, $font, $color, $bgcolor, $x = 0, $y = 0)
{
    if ($x > 0) {
        $img_x = $x;
    } else {
        $img_x = $size * 0.8 * strlen($text);
    }
    // the factor reduces the amount of whitespace at the end of the string
    if ($y > 0) {
        $img_y = $y;
    } else {
        $img_y = $size + 10;
    }
    $img_base = (int) (($size + 10) * 0.75);
    // a rough guesstimate of where the text baseline should be in the image
    // echo "Text is $text, $img_x, $img_y, $img_base, R: $r G: $g B: $b <br />"; exit;
    $im = @imageCreate($img_x, $img_y) or die("Cannot Initialize new GD image stream");
    $background_color = imageColorAllocate($im, hexdec(substr($bgcolor, 0, 2)), hexdec(substr($bgcolor, 2, 2)), hexdec(substr($bgcolor, 4, 2)));
    $text_color = imageColorAllocate($im, hexdec(substr($color, 0, 2)), hexdec(substr($color, 2, 2)), hexdec(substr($color, 4, 2)));
    ImageTTFText($im, $size, 0, 2, $img_base, $text_color, $font, $text);
    /*
    	// Date in the past
    	header("Expires: Thu, 28 Aug 1997 05:00:00 GMT");
    
    	// always modified
    	$timestamp = gmdate("D, d M Y H:i:s");
    	header("Last-Modified: " . $timestamp . " GMT");
     
    	// HTTP/1.1
    	header("Cache-Control: no-store, no-cache, must-revalidate");
    	header("Cache-Control: post-check=0, pre-check=0", false);
    
    	// HTTP/1.0
    	header("Pragma: no-cache");
    */
    // dump out the image
    header("Content-type: image/jpeg");
    ImageJPEG($im);
}
 /**
  * Create PNG of font name written with font TTF.
  */
 public function generate_image()
 {
     $width = $height = $font_size = $left_margin = $background_color = $font_color = false;
     extract($this->preview_attributes, EXTR_IF_EXISTS);
     // Text Mask
     $mask = imageCreate($width, $height);
     $background = imageColorAllocate($mask, $background_color[0], $background_color[1], $background_color[2]);
     $foreground = imageColorAllocate($mask, $font_color[0], $font_color[1], $font_color[2]);
     $ttf_path = $this->font->maybe_get_remote_ttf();
     if (!file_exists($ttf_path)) {
         wp_die('Could not load $ttf_path: ' . $ttf_path);
     }
     // Text
     $y = $this->get_centered_y_coordinate($font_size, $ttf_path, $this->font->family);
     imagettftext($mask, $font_size, 0, $left_margin, $y, $foreground, $ttf_path, $this->font->family);
     // White fill
     $white = imageCreate($width, $height);
     $background = imageColorAllocate($white, $background_color[0], $background_color[1], $background_color[2]);
     // Image
     $image = imagecreatetruecolor($width, $height);
     imagesavealpha($image, true);
     imagefill($image, 0, 0, imagecolorallocatealpha($image, 0, 0, 0, 127));
     // Apply Mask to Image
     for ($x = 0; $x < $width; $x++) {
         for ($y = 0; $y < $height; $y++) {
             $alpha = imagecolorsforindex($mask, imagecolorat($mask, $x, $y));
             $alpha = 127 - floor($alpha['red'] / 2);
             $color = imagecolorsforindex($white, imagecolorat($white, $x, $y));
             imagesetpixel($image, $x, $y, imagecolorallocatealpha($image, $color['red'], $color['green'], $color['blue'], $alpha));
         }
     }
     ob_start();
     imagePNG($image);
     $image = ob_get_clean();
     $this->save_image($image);
     // header("Content-type: image/png");
     // echo $image;
 }
Пример #28
0
 protected function _getColor(Image_3D_Color $color, $alpha = 1.0)
 {
     $values = $color->getValues();
     $values[0] = (int) round($values[0] * 255);
     $values[1] = (int) round($values[1] * 255);
     $values[2] = (int) round($values[2] * 255);
     $values[3] = (int) round((1 - (1 - $values[3]) * $alpha) * 127);
     if ($values[3] > 0) {
         // Tranzparente Farbe allokieren
         $color = imageColorExactAlpha($this->_image, $values[0], $values[1], $values[2], $values[3]);
         if ($color === -1) {
             // Wenn nicht Farbe neu alloziieren
             $color = imageColorAllocateAlpha($this->_image, $values[0], $values[1], $values[2], $values[3]);
         }
     } else {
         // Deckende Farbe allozieren
         $color = imageColorExact($this->_image, $values[0], $values[1], $values[2]);
         if ($color === -1) {
             // Wenn nicht Farbe neu alloziieren
             $color = imageColorAllocate($this->_image, $values[0], $values[1], $values[2]);
         }
     }
     return $color;
 }
Пример #29
0
 function _adjustTransparency(&$Source, &$Destination)
 {
     if ($this->_isTransparent($Source)) {
         $rgba = imageColorsForIndex($Source, imageColorTransparent($Source));
         $color = imageColorAllocate($Destination, $rgba['red'], $rgba['green'], $rgba['blue']);
         imageColorTransparent($Destination, $color);
         imageFill($Destination, 0, 0, $color);
     } else {
         if ($this->_format == 'png') {
             imageAlphaBlending($Destination, false);
             imageSaveAlpha($Destination, true);
         } elseif ($this->_format != 'gif') {
             $white = imageColorAllocate($Destination, 255, 255, 255);
             imageFill($Destination, 0, 0, $white);
         }
     }
 }
Пример #30
0
 /**
  * Actually uploads the file, and act on it according to the set processing class variables
  *
  * This function copies the uploaded file to the given location, eventually performing actions on it.
  * Typically, you can call {@link process} several times for the same file,
  * for instance to create a resized image and a thumbnail of the same file.
  * The original uploaded file remains intact in its temporary location, so you can use {@link process} several times.
  * You will be able to delete the uploaded file with {@link clean} when you have finished all your {@link process} calls.
  *
  * According to the processing class variables set in the calling file, the file can be renamed,
  * and if it is an image, can be resized or converted.
  *
  * When the processing is completed, and the file copied to its new location, the
  * processing class variables will be reset to their default value.
  * This allows you to set new properties, and perform another {@link process} on the same uploaded file
  *
  * If the function is called with a null or empty argument, then it will return the content of the picture
  *
  * It will set {@link processed} (and {@link error} is an error occurred)
  *
  * @access public
  * @param  string $server_path Optional path location of the uploaded file, with an ending slash
  * @return string Optional content of the image
  */
 function process($server_path = null)
 {
     $this->error = '';
     $this->processed = true;
     $return_mode = false;
     $return_content = null;
     // clean up dst variables
     $this->file_dst_path = '';
     $this->file_dst_pathname = '';
     $this->file_dst_name = '';
     $this->file_dst_name_body = '';
     $this->file_dst_name_ext = '';
     if (!$this->uploaded) {
         $this->error = $this->translate('file_not_uploaded');
         $this->processed = false;
     }
     if ($this->processed) {
         if (empty($server_path) || is_null($server_path)) {
             $this->log .= '<b>process file and return the content</b><br />';
             $return_mode = true;
         } else {
             if (strtolower(substr(PHP_OS, 0, 3)) === 'win') {
                 if (substr($server_path, -1, 1) != '\\') {
                     $server_path = $server_path . '\\';
                 }
             } else {
                 if (substr($server_path, -1, 1) != '/') {
                     $server_path = $server_path . '/';
                 }
             }
             $this->log .= '<b>process file to ' . $server_path . '</b><br />';
         }
     }
     if ($this->processed) {
         // checks file max size
         if ($this->file_src_size > $this->file_max_size) {
             $this->processed = false;
             $this->error = $this->translate('file_too_big');
         } else {
             $this->log .= '- file size OK<br />';
         }
     }
     if ($this->processed) {
         // if we have an image without extension, set it
         if ($this->file_is_image && !$this->file_src_name_ext_) {
             $this->file_src_name_ext = $this->file_src_name_ext_ = $this->image_src_type;
         }
         // turn dangerous scripts into text files
         if ($this->no_script) {
             if ((substr($this->file_src_mime, 0, 5) == 'text/' && $this->file_src_mime != 'text/rtf' || strpos($this->file_src_mime, 'javascript') !== false) && substr($this->file_src_name, -4) != '.txt' || preg_match('/\\.(php|pl|py|cgi|asp|js)$/i', $this->file_src_name) || empty($this->file_src_name_ext_)) {
                 $this->file_src_mime = 'text/plain';
                 $this->log .= '- script ' . $this->file_src_name . ' renamed as ' . $this->file_src_name . '.txt!<br />';
                 $this->file_src_name_ext = $this->file_src_name_ext_ . (empty($this->file_src_name_ext_) ? 'txt' : '.txt');
             }
         }
         if ($this->mime_check && empty($this->file_src_mime)) {
             $this->processed = false;
             $this->error = $this->translate('no_mime');
         } else {
             if ($this->mime_check && !empty($this->file_src_mime) && strpos($this->file_src_mime, '/') !== false) {
                 list($m1, $m2) = explode('/', $this->file_src_mime);
                 $allowed = false;
                 // check wether the mime type is allowed
                 foreach ($this->allowed as $k => $v) {
                     list($v1, $v2) = explode('/', $v);
                     if ($v1 == '*' && $v2 == '*' || $v1 == $m1 && ($v2 == $m2 || $v2 == '*')) {
                         $allowed = true;
                         break;
                     }
                 }
                 // check wether the mime type is forbidden
                 foreach ($this->forbidden as $k => $v) {
                     list($v1, $v2) = explode('/', $v);
                     if ($v1 == '*' && $v2 == '*' || $v1 == $m1 && ($v2 == $m2 || $v2 == '*')) {
                         $allowed = false;
                         break;
                     }
                 }
                 if (!$allowed) {
                     $this->processed = false;
                     $this->error = $this->translate('incorrect_file');
                 } else {
                     $this->log .= '- file mime OK : ' . $this->file_src_mime . '<br />';
                 }
             } else {
                 $this->log .= '- file mime (not checked) : ' . $this->file_src_mime . '<br />';
             }
         }
         // if the file is an image, we can check on its dimensions
         // these checks are not available if open_basedir restrictions are in place
         if ($this->file_is_image) {
             if (is_numeric($this->image_src_x) && is_numeric($this->image_src_y)) {
                 $ratio = $this->image_src_x / $this->image_src_y;
                 if (!is_null($this->image_max_width) && $this->image_src_x > $this->image_max_width) {
                     $this->processed = false;
                     $this->error = $this->translate('image_too_wide');
                 }
                 if (!is_null($this->image_min_width) && $this->image_src_x < $this->image_min_width) {
                     $this->processed = false;
                     $this->error = $this->translate('image_too_narrow');
                 }
                 if (!is_null($this->image_max_height) && $this->image_src_y > $this->image_max_height) {
                     $this->processed = false;
                     $this->error = $this->translate('image_too_high');
                 }
                 if (!is_null($this->image_min_height) && $this->image_src_y < $this->image_min_height) {
                     $this->processed = false;
                     $this->error = $this->translate('image_too_short');
                 }
                 if (!is_null($this->image_max_ratio) && $ratio > $this->image_max_ratio) {
                     $this->processed = false;
                     $this->error = $this->translate('ratio_too_high');
                 }
                 if (!is_null($this->image_min_ratio) && $ratio < $this->image_min_ratio) {
                     $this->processed = false;
                     $this->error = $this->translate('ratio_too_low');
                 }
                 if (!is_null($this->image_max_pixels) && $this->image_src_pixels > $this->image_max_pixels) {
                     $this->processed = false;
                     $this->error = $this->translate('too_many_pixels');
                 }
                 if (!is_null($this->image_min_pixels) && $this->image_src_pixels < $this->image_min_pixels) {
                     $this->processed = false;
                     $this->error = $this->translate('not_enough_pixels');
                 }
             } else {
                 $this->log .= '- no image properties available, can\'t enforce dimension checks : ' . $this->file_src_mime . '<br />';
             }
         }
     }
     if ($this->processed) {
         $this->file_dst_path = $server_path;
         // repopulate dst variables from src
         $this->file_dst_name = $this->file_src_name;
         $this->file_dst_name_body = $this->file_src_name_body;
         $this->file_dst_name_ext = $this->file_src_name_ext;
         if ($this->file_overwrite) {
             $this->file_auto_rename = false;
         }
         if ($this->image_convert != '') {
             // if we convert as an image
             $this->file_dst_name_ext = $this->image_convert;
             $this->log .= '- new file name ext : ' . $this->image_convert . '<br />';
         }
         if ($this->file_new_name_body != '') {
             // rename file body
             $this->file_dst_name_body = $this->file_new_name_body;
             $this->log .= '- new file name body : ' . $this->file_new_name_body . '<br />';
         }
         if ($this->file_new_name_ext != '') {
             // rename file ext
             $this->file_dst_name_ext = $this->file_new_name_ext;
             $this->log .= '- new file name ext : ' . $this->file_new_name_ext . '<br />';
         }
         if ($this->file_name_body_add != '') {
             // append a string to the name
             $this->file_dst_name_body = $this->file_dst_name_body . $this->file_name_body_add;
             $this->log .= '- file name body append : ' . $this->file_name_body_add . '<br />';
         }
         if ($this->file_name_body_pre != '') {
             // prepend a string to the name
             $this->file_dst_name_body = $this->file_name_body_pre . $this->file_dst_name_body;
             $this->log .= '- file name body prepend : ' . $this->file_name_body_pre . '<br />';
         }
         if ($this->file_safe_name) {
             // formats the name
             $this->file_dst_name_body = str_replace(array(' ', '-'), array('_', '_'), $this->file_dst_name_body);
             $this->file_dst_name_body = preg_replace('/[^A-Za-z0-9_]/', '', $this->file_dst_name_body);
             $this->log .= '- file name safe format<br />';
         }
         $this->log .= '- destination variables<br />';
         if (empty($this->file_dst_path) || is_null($this->file_dst_path)) {
             $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;file_dst_path         : n/a<br />';
         } else {
             $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;file_dst_path         : ' . $this->file_dst_path . '<br />';
         }
         $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;file_dst_name_body    : ' . $this->file_dst_name_body . '<br />';
         $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;file_dst_name_ext     : ' . $this->file_dst_name_ext . '<br />';
         // do we do some image manipulation?
         $image_manipulation = $this->file_is_image && ($this->image_resize || $this->image_convert != '' || is_numeric($this->image_brightness) || is_numeric($this->image_contrast) || is_numeric($this->image_threshold) || !empty($this->image_tint_color) || !empty($this->image_overlay_color) || $this->image_unsharp || !empty($this->image_text) || $this->image_greyscale || $this->image_negative || !empty($this->image_watermark) || is_numeric($this->image_rotate) || is_numeric($this->jpeg_size) || !empty($this->image_flip) || !empty($this->image_crop) || !empty($this->image_precrop) || !empty($this->image_border) || $this->image_frame > 0 || $this->image_bevel > 0 || $this->image_reflection_height);
         if ($image_manipulation) {
             if ($this->image_convert == '') {
                 $this->file_dst_name = $this->file_dst_name_body . (!empty($this->file_dst_name_ext) ? '.' . $this->file_dst_name_ext : '');
                 $this->log .= '- image operation, keep extension<br />';
             } else {
                 $this->file_dst_name = $this->file_dst_name_body . '.' . $this->image_convert;
                 $this->log .= '- image operation, change extension for conversion type<br />';
             }
         } else {
             $this->file_dst_name = $this->file_dst_name_body . (!empty($this->file_dst_name_ext) ? '.' . $this->file_dst_name_ext : '');
             $this->log .= '- no image operation, keep extension<br />';
         }
         if (!$return_mode) {
             if (!$this->file_auto_rename) {
                 $this->log .= '- no auto_rename if same filename exists<br />';
                 $this->file_dst_pathname = $this->file_dst_path . $this->file_dst_name;
             } else {
                 $this->log .= '- checking for auto_rename<br />';
                 $this->file_dst_pathname = $this->file_dst_path . $this->file_dst_name;
                 $body = $this->file_dst_name_body;
                 $cpt = 1;
                 while (@file_exists($this->file_dst_pathname)) {
                     $this->file_dst_name_body = $body . '_' . $cpt;
                     $this->file_dst_name = $this->file_dst_name_body . (!empty($this->file_dst_name_ext) ? '.' . $this->file_dst_name_ext : '');
                     $cpt++;
                     $this->file_dst_pathname = $this->file_dst_path . $this->file_dst_name;
                 }
                 if ($cpt > 1) {
                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;auto_rename to ' . $this->file_dst_name . '<br />';
                 }
             }
             $this->log .= '- destination file details<br />';
             $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;file_dst_name         : ' . $this->file_dst_name . '<br />';
             $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;file_dst_pathname     : ' . $this->file_dst_pathname . '<br />';
             if ($this->file_overwrite) {
                 $this->log .= '- no overwrite checking<br />';
             } else {
                 if (@file_exists($this->file_dst_pathname)) {
                     $this->processed = false;
                     $this->error = $this->translate('already_exists', array($this->file_dst_name));
                 } else {
                     $this->log .= '- ' . $this->file_dst_name . ' doesn\'t exist already<br />';
                 }
             }
         }
     }
     if ($this->processed) {
         // if we have already moved the uploaded file, we use the temporary copy as source file, and check if it exists
         if (!empty($this->file_src_temp)) {
             $this->log .= '- use the temp file instead of the original file since it is a second process<br />';
             $this->file_src_pathname = $this->file_src_temp;
             if (!file_exists($this->file_src_pathname)) {
                 $this->processed = false;
                 $this->error = $this->translate('temp_file_missing');
             }
             // if we haven't a temp file, and that we do check on uploads, we use is_uploaded_file()
         } else {
             if (!$this->no_upload_check) {
                 if (!is_uploaded_file($this->file_src_pathname)) {
                     $this->processed = false;
                     $this->error = $this->translate('source_missing');
                 }
                 // otherwise, if we don't check on uploaded files (local file for instance), we use file_exists()
             } else {
                 if (!file_exists($this->file_src_pathname)) {
                     $this->processed = false;
                     $this->error = $this->translate('source_missing');
                 }
             }
         }
         // checks if the destination directory exists, and attempt to create it
         if (!$return_mode) {
             if ($this->processed && !file_exists($this->file_dst_path)) {
                 if ($this->dir_auto_create) {
                     $this->log .= '- ' . $this->file_dst_path . ' doesn\'t exist. Attempting creation:';
                     if (!$this->rmkdir($this->file_dst_path, $this->dir_chmod)) {
                         $this->log .= ' failed<br />';
                         $this->processed = false;
                         $this->error = $this->translate('destination_dir');
                     } else {
                         $this->log .= ' success<br />';
                     }
                 } else {
                     $this->error = $this->translate('destination_dir_missing');
                 }
             }
             if ($this->processed && !is_dir($this->file_dst_path)) {
                 $this->processed = false;
                 $this->error = $this->translate('destination_path_not_dir');
             }
             // checks if the destination directory is writeable, and attempt to make it writeable
             $hash = md5($this->file_dst_name_body . rand(1, 1000));
             if ($this->processed && !($f = @fopen($this->file_dst_path . $hash . '.' . $this->file_dst_name_ext, 'a+'))) {
                 if ($this->dir_auto_chmod) {
                     $this->log .= '- ' . $this->file_dst_path . ' is not writeable. Attempting chmod:';
                     if (!@chmod($this->file_dst_path, $this->dir_chmod)) {
                         $this->log .= ' failed<br />';
                         $this->processed = false;
                         $this->error = $this->translate('destination_dir_write');
                     } else {
                         $this->log .= ' success<br />';
                         if (!($f = @fopen($this->file_dst_path . $hash . '.' . $this->file_dst_name_ext, 'a+'))) {
                             // we re-check
                             $this->processed = false;
                             $this->error = $this->translate('destination_dir_write');
                         } else {
                             @fclose($f);
                         }
                     }
                 } else {
                     $this->processed = false;
                     $this->error = $this->translate('destination_path_write');
                 }
             } else {
                 if ($this->processed) {
                     @fclose($f);
                 }
                 @unlink($this->file_dst_path . $hash . '.' . $this->file_dst_name_ext);
             }
             // if we have an uploaded file, and if it is the first process, and if we can't access the file directly (open_basedir restriction)
             // then we create a temp file that will be used as the source file in subsequent processes
             // the third condition is there to check if the file is not accessible *directly* (it already has positively gone through is_uploaded_file(), so it exists)
             if (!$this->no_upload_check && empty($this->file_src_temp) && !@file_exists($this->file_src_pathname)) {
                 $this->log .= '- attempting to use a temp file:';
                 $hash = md5($this->file_dst_name_body . rand(1, 1000));
                 if (move_uploaded_file($this->file_src_pathname, $this->file_dst_path . $hash . '.' . $this->file_dst_name_ext)) {
                     $this->file_src_pathname = $this->file_dst_path . $hash . '.' . $this->file_dst_name_ext;
                     $this->file_src_temp = $this->file_src_pathname;
                     $this->log .= ' file created<br />';
                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;temp file is: ' . $this->file_src_temp . '<br />';
                 } else {
                     $this->log .= ' failed<br />';
                     $this->processed = false;
                     $this->error = $this->translate('temp_file');
                 }
             }
         }
     }
     if ($this->processed) {
         // we do a quick check to ensure the file is really an image
         // we can do this only now, as it would have failed before in case of open_basedir
         if ($image_manipulation && !@getimagesize($this->file_src_pathname)) {
             $this->log .= '- the file is not an image!<br />';
             $image_manipulation = false;
         }
         if ($image_manipulation) {
             // checks if the source file is readable
             if ($this->processed && !($f = @fopen($this->file_src_pathname, 'r'))) {
                 $this->processed = false;
                 $this->error = $this->translate('source_not_readable');
             } else {
                 @fclose($f);
             }
             // we now do all the image manipulations
             $this->log .= '- image resizing or conversion wanted<br />';
             if ($this->gdversion()) {
                 switch ($this->image_src_type) {
                     case 'jpg':
                         if (!function_exists('imagecreatefromjpeg')) {
                             $this->processed = false;
                             $this->error = $this->translate('no_create_support', array('JPEG'));
                         } else {
                             $image_src = @imagecreatefromjpeg($this->file_src_pathname);
                             if (!$image_src) {
                                 $this->processed = false;
                                 $this->error = $this->translate('create_error', array('JPEG'));
                             } else {
                                 $this->log .= '- source image is JPEG<br />';
                             }
                         }
                         break;
                     case 'png':
                         if (!function_exists('imagecreatefrompng')) {
                             $this->processed = false;
                             $this->error = $this->translate('no_create_support', array('PNG'));
                         } else {
                             $image_src = @imagecreatefrompng($this->file_src_pathname);
                             if (!$image_src) {
                                 $this->processed = false;
                                 $this->error = $this->translate('create_error', array('PNG'));
                             } else {
                                 $this->log .= '- source image is PNG<br />';
                             }
                         }
                         break;
                     case 'gif':
                         if (!function_exists('imagecreatefromgif')) {
                             $this->processed = false;
                             $this->error = $this->translate('no_create_support', array('GIF'));
                         } else {
                             $image_src = @imagecreatefromgif($this->file_src_pathname);
                             if (!$image_src) {
                                 $this->processed = false;
                                 $this->error = $this->translate('create_error', array('GIF'));
                             } else {
                                 $this->log .= '- source image is GIF<br />';
                             }
                         }
                         break;
                     case 'bmp':
                         if (!method_exists($this, 'imagecreatefrombmp')) {
                             $this->processed = false;
                             $this->error = $this->translate('no_create_support', array('BMP'));
                         } else {
                             $image_src = @$this->imagecreatefrombmp($this->file_src_pathname);
                             if (!$image_src) {
                                 $this->processed = false;
                                 $this->error = $this->translate('create_error', array('BMP'));
                             } else {
                                 $this->log .= '- source image is BMP<br />';
                             }
                         }
                         break;
                     default:
                         $this->processed = false;
                         $this->error = $this->translate('source_invalid');
                 }
             } else {
                 $this->processed = false;
                 $this->error = $this->translate('gd_missing');
             }
             if ($this->processed && $image_src) {
                 // we have to set image_convert if it is not already
                 if (empty($this->image_convert)) {
                     $this->log .= '- setting destination file type to ' . $this->file_src_name_ext . '<br />';
                     $this->image_convert = $this->file_src_name_ext;
                 }
                 if (!in_array($this->image_convert, $this->image_supported)) {
                     $this->image_convert = 'jpg';
                 }
                 // we set the default color to be the background color if we don't output in a transparent format
                 if ($this->image_convert != 'png' && $this->image_convert != 'gif' && !empty($this->image_default_color) && empty($this->image_background_color)) {
                     $this->image_background_color = $this->image_default_color;
                 }
                 if (!empty($this->image_background_color)) {
                     $this->image_default_color = $this->image_background_color;
                 }
                 if (empty($this->image_default_color)) {
                     $this->image_default_color = '#FFFFFF';
                 }
                 $this->image_src_x = imagesx($image_src);
                 $this->image_src_y = imagesy($image_src);
                 $gd_version = $this->gdversion();
                 $ratio_crop = null;
                 if (!imageistruecolor($image_src)) {
                     // $this->image_src_type == 'gif'
                     $this->log .= '- image is detected as having a palette<br />';
                     $this->image_is_palette = true;
                     $this->image_transparent_color = imagecolortransparent($image_src);
                     if ($this->image_transparent_color >= 0 && imagecolorstotal($image_src) > $this->image_transparent_color) {
                         $this->image_is_transparent = true;
                         $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;palette image is detected as transparent<br />';
                     }
                     // if the image has a palette (GIF), we convert it to true color, preserving transparency
                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;convert palette image to true color<br />';
                     $true_color = imagecreatetruecolor($this->image_src_x, $this->image_src_y);
                     imagealphablending($true_color, false);
                     imagesavealpha($true_color, true);
                     for ($x = 0; $x < $this->image_src_x; $x++) {
                         for ($y = 0; $y < $this->image_src_y; $y++) {
                             if ($this->image_transparent_color >= 0 && imagecolorat($image_src, $x, $y) == $this->image_transparent_color) {
                                 imagesetpixel($true_color, $x, $y, 127 << 24);
                             } else {
                                 $rgb = imagecolorsforindex($image_src, imagecolorat($image_src, $x, $y));
                                 imagesetpixel($true_color, $x, $y, $rgb['alpha'] << 24 | $rgb['red'] << 16 | $rgb['green'] << 8 | $rgb['blue']);
                             }
                         }
                     }
                     $image_src = $this->imagetransfer($true_color, $image_src);
                     imagealphablending($image_src, false);
                     imagesavealpha($image_src, true);
                     $this->image_is_palette = false;
                 }
                 $image_dst =& $image_src;
                 // pre-crop image, before resizing
                 if (!empty($this->image_precrop)) {
                     if (is_array($this->image_precrop)) {
                         $vars = $this->image_precrop;
                     } else {
                         $vars = explode(' ', $this->image_precrop);
                     }
                     if (sizeof($vars) == 4) {
                         $ct = $vars[0];
                         $cr = $vars[1];
                         $cb = $vars[2];
                         $cl = $vars[3];
                     } else {
                         if (sizeof($vars) == 2) {
                             $ct = $vars[0];
                             $cr = $vars[1];
                             $cb = $vars[0];
                             $cl = $vars[1];
                         } else {
                             $ct = $vars[0];
                             $cr = $vars[0];
                             $cb = $vars[0];
                             $cl = $vars[0];
                         }
                     }
                     if (strpos($ct, '%') > 0) {
                         $ct = $this->image_src_y * (str_replace('%', '', $ct) / 100);
                     }
                     if (strpos($cr, '%') > 0) {
                         $cr = $this->image_src_x * (str_replace('%', '', $cr) / 100);
                     }
                     if (strpos($cb, '%') > 0) {
                         $cb = $this->image_src_y * (str_replace('%', '', $cb) / 100);
                     }
                     if (strpos($cl, '%') > 0) {
                         $cl = $this->image_src_x * (str_replace('%', '', $cl) / 100);
                     }
                     if (strpos($ct, 'px') > 0) {
                         $ct = str_replace('px', '', $ct);
                     }
                     if (strpos($cr, 'px') > 0) {
                         $cr = str_replace('px', '', $cr);
                     }
                     if (strpos($cb, 'px') > 0) {
                         $cb = str_replace('px', '', $cb);
                     }
                     if (strpos($cl, 'px') > 0) {
                         $cl = str_replace('px', '', $cl);
                     }
                     $ct = (int) $ct;
                     $cr = (int) $cr;
                     $cb = (int) $cb;
                     $cl = (int) $cl;
                     $this->log .= '- pre-crop image : ' . $ct . ' ' . $cr . ' ' . $cb . ' ' . $cl . ' <br />';
                     $this->image_src_x = $this->image_src_x - $cl - $cr;
                     $this->image_src_y = $this->image_src_y - $ct - $cb;
                     if ($this->image_src_x < 1) {
                         $this->image_src_x = 1;
                     }
                     if ($this->image_src_y < 1) {
                         $this->image_src_y = 1;
                     }
                     $tmp = $this->imagecreatenew($this->image_src_x, $this->image_src_y);
                     // we copy the image into the recieving image
                     imagecopy($tmp, $image_dst, 0, 0, $cl, $ct, $this->image_src_x, $this->image_src_y);
                     // if we crop with negative margins, we have to make sure the extra bits are the right color, or transparent
                     if ($ct < 0 || $cr < 0 || $cb < 0 || $cl < 0) {
                         // use the background color if present
                         if (!empty($this->image_background_color)) {
                             list($red, $green, $blue) = $this->getcolors($this->image_background_color);
                             $fill = imagecolorallocate($tmp, $red, $green, $blue);
                         } else {
                             $fill = imagecolorallocatealpha($tmp, 0, 0, 0, 127);
                         }
                         // fills eventual negative margins
                         if ($ct < 0) {
                             imagefilledrectangle($tmp, 0, 0, $this->image_src_x, -$ct, $fill);
                         }
                         if ($cr < 0) {
                             imagefilledrectangle($tmp, $this->image_src_x + $cr, 0, $this->image_src_x, $this->image_src_y, $fill);
                         }
                         if ($cb < 0) {
                             imagefilledrectangle($tmp, 0, $this->image_src_y + $cb, $this->image_src_x, $this->image_src_y, $fill);
                         }
                         if ($cl < 0) {
                             imagefilledrectangle($tmp, 0, 0, -$cl, $this->image_src_y, $fill);
                         }
                     }
                     // we transfert tmp into image_dst
                     $image_dst = $this->imagetransfer($tmp, $image_dst);
                 }
                 // resize image (and move image_src_x, image_src_y dimensions into image_dst_x, image_dst_y)
                 if ($this->image_resize) {
                     $this->log .= '- resizing...<br />';
                     if ($this->image_ratio_x) {
                         $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;calculate x size<br />';
                         $this->image_dst_x = round($this->image_src_x * $this->image_y / $this->image_src_y);
                         $this->image_dst_y = $this->image_y;
                     } else {
                         if ($this->image_ratio_y) {
                             $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;calculate y size<br />';
                             $this->image_dst_x = $this->image_x;
                             $this->image_dst_y = round($this->image_src_y * $this->image_x / $this->image_src_x);
                         } else {
                             if (is_numeric($this->image_ratio_pixels)) {
                                 $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;calculate x/y size to match a number of pixels<br />';
                                 $pixels = $this->image_src_y * $this->image_src_x;
                                 $diff = sqrt($this->image_ratio_pixels / $pixels);
                                 $this->image_dst_x = round($this->image_src_x * $diff);
                                 $this->image_dst_y = round($this->image_src_y * $diff);
                             } else {
                                 if ($this->image_ratio || $this->image_ratio_crop || $this->image_ratio_fill || $this->image_ratio_no_zoom_in || $this->image_ratio_no_zoom_out) {
                                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;check x/y sizes<br />';
                                     if (!$this->image_ratio_no_zoom_in && !$this->image_ratio_no_zoom_out || $this->image_ratio_no_zoom_in && ($this->image_src_x > $this->image_x || $this->image_src_y > $this->image_y) || $this->image_ratio_no_zoom_out && $this->image_src_x < $this->image_x && $this->image_src_y < $this->image_y) {
                                         $this->image_dst_x = $this->image_x;
                                         $this->image_dst_y = $this->image_y;
                                         if ($this->image_ratio_crop) {
                                             if (!is_string($this->image_ratio_crop)) {
                                                 $this->image_ratio_crop = '';
                                             }
                                             $this->image_ratio_crop = strtolower($this->image_ratio_crop);
                                             if ($this->image_src_x / $this->image_x > $this->image_src_y / $this->image_y) {
                                                 $this->image_dst_y = $this->image_y;
                                                 $this->image_dst_x = intval($this->image_src_x * ($this->image_y / $this->image_src_y));
                                                 $ratio_crop = array();
                                                 $ratio_crop['x'] = $this->image_dst_x - $this->image_x;
                                                 if (strpos($this->image_ratio_crop, 'l') !== false) {
                                                     $ratio_crop['l'] = 0;
                                                     $ratio_crop['r'] = $ratio_crop['x'];
                                                 } else {
                                                     if (strpos($this->image_ratio_crop, 'r') !== false) {
                                                         $ratio_crop['l'] = $ratio_crop['x'];
                                                         $ratio_crop['r'] = 0;
                                                     } else {
                                                         $ratio_crop['l'] = round($ratio_crop['x'] / 2);
                                                         $ratio_crop['r'] = $ratio_crop['x'] - $ratio_crop['l'];
                                                     }
                                                 }
                                                 $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;ratio_crop_x         : ' . $ratio_crop['x'] . ' (' . $ratio_crop['l'] . ';' . $ratio_crop['r'] . ')<br />';
                                                 if (is_null($this->image_crop)) {
                                                     $this->image_crop = array(0, 0, 0, 0);
                                                 }
                                             } else {
                                                 $this->image_dst_x = $this->image_x;
                                                 $this->image_dst_y = intval($this->image_src_y * ($this->image_x / $this->image_src_x));
                                                 $ratio_crop = array();
                                                 $ratio_crop['y'] = $this->image_dst_y - $this->image_y;
                                                 if (strpos($this->image_ratio_crop, 't') !== false) {
                                                     $ratio_crop['t'] = 0;
                                                     $ratio_crop['b'] = $ratio_crop['y'];
                                                 } else {
                                                     if (strpos($this->image_ratio_crop, 'b') !== false) {
                                                         $ratio_crop['t'] = $ratio_crop['y'];
                                                         $ratio_crop['b'] = 0;
                                                     } else {
                                                         $ratio_crop['t'] = round($ratio_crop['y'] / 2);
                                                         $ratio_crop['b'] = $ratio_crop['y'] - $ratio_crop['t'];
                                                     }
                                                 }
                                                 $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;ratio_crop_y         : ' . $ratio_crop['y'] . ' (' . $ratio_crop['t'] . ';' . $ratio_crop['b'] . ')<br />';
                                                 if (is_null($this->image_crop)) {
                                                     $this->image_crop = array(0, 0, 0, 0);
                                                 }
                                             }
                                         } else {
                                             if ($this->image_ratio_fill) {
                                                 if (!is_string($this->image_ratio_fill)) {
                                                     $this->image_ratio_fill = '';
                                                 }
                                                 $this->image_ratio_fill = strtolower($this->image_ratio_fill);
                                                 if ($this->image_src_x / $this->image_x < $this->image_src_y / $this->image_y) {
                                                     $this->image_dst_y = $this->image_y;
                                                     $this->image_dst_x = intval($this->image_src_x * ($this->image_y / $this->image_src_y));
                                                     $ratio_crop = array();
                                                     $ratio_crop['x'] = $this->image_dst_x - $this->image_x;
                                                     if (strpos($this->image_ratio_fill, 'l') !== false) {
                                                         $ratio_crop['l'] = 0;
                                                         $ratio_crop['r'] = $ratio_crop['x'];
                                                     } else {
                                                         if (strpos($this->image_ratio_fill, 'r') !== false) {
                                                             $ratio_crop['l'] = $ratio_crop['x'];
                                                             $ratio_crop['r'] = 0;
                                                         } else {
                                                             $ratio_crop['l'] = round($ratio_crop['x'] / 2);
                                                             $ratio_crop['r'] = $ratio_crop['x'] - $ratio_crop['l'];
                                                         }
                                                     }
                                                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;ratio_fill_x         : ' . $ratio_crop['x'] . ' (' . $ratio_crop['l'] . ';' . $ratio_crop['r'] . ')<br />';
                                                     if (is_null($this->image_crop)) {
                                                         $this->image_crop = array(0, 0, 0, 0);
                                                     }
                                                 } else {
                                                     $this->image_dst_x = $this->image_x;
                                                     $this->image_dst_y = intval($this->image_src_y * ($this->image_x / $this->image_src_x));
                                                     $ratio_crop = array();
                                                     $ratio_crop['y'] = $this->image_dst_y - $this->image_y;
                                                     if (strpos($this->image_ratio_fill, 't') !== false) {
                                                         $ratio_crop['t'] = 0;
                                                         $ratio_crop['b'] = $ratio_crop['y'];
                                                     } else {
                                                         if (strpos($this->image_ratio_fill, 'b') !== false) {
                                                             $ratio_crop['t'] = $ratio_crop['y'];
                                                             $ratio_crop['b'] = 0;
                                                         } else {
                                                             $ratio_crop['t'] = round($ratio_crop['y'] / 2);
                                                             $ratio_crop['b'] = $ratio_crop['y'] - $ratio_crop['t'];
                                                         }
                                                     }
                                                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;ratio_fill_y         : ' . $ratio_crop['y'] . ' (' . $ratio_crop['t'] . ';' . $ratio_crop['b'] . ')<br />';
                                                     if (is_null($this->image_crop)) {
                                                         $this->image_crop = array(0, 0, 0, 0);
                                                     }
                                                 }
                                             } else {
                                                 if ($this->image_src_x / $this->image_x > $this->image_src_y / $this->image_y) {
                                                     $this->image_dst_x = $this->image_x;
                                                     $this->image_dst_y = intval($this->image_src_y * ($this->image_x / $this->image_src_x));
                                                 } else {
                                                     $this->image_dst_y = $this->image_y;
                                                     $this->image_dst_x = intval($this->image_src_x * ($this->image_y / $this->image_src_y));
                                                 }
                                             }
                                         }
                                     } else {
                                         $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;doesn\'t calculate x/y sizes<br />';
                                         $this->image_dst_x = $this->image_src_x;
                                         $this->image_dst_y = $this->image_src_y;
                                     }
                                 } else {
                                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;use plain sizes<br />';
                                     $this->image_dst_x = $this->image_x;
                                     $this->image_dst_y = $this->image_y;
                                 }
                             }
                         }
                     }
                     if ($this->image_dst_x < 1) {
                         $this->image_dst_x = 1;
                     }
                     if ($this->image_dst_y < 1) {
                         $this->image_dst_y = 1;
                     }
                     $tmp = $this->imagecreatenew($this->image_dst_x, $this->image_dst_y);
                     if ($gd_version >= 2) {
                         $res = imagecopyresampled($tmp, $image_src, 0, 0, 0, 0, $this->image_dst_x, $this->image_dst_y, $this->image_src_x, $this->image_src_y);
                     } else {
                         $res = imagecopyresized($tmp, $image_src, 0, 0, 0, 0, $this->image_dst_x, $this->image_dst_y, $this->image_src_x, $this->image_src_y);
                     }
                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;resized image object created<br />';
                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;image_src_x y        : ' . $this->image_src_x . ' x ' . $this->image_src_y . '<br />';
                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;image_dst_x y        : ' . $this->image_dst_x . ' x ' . $this->image_dst_y . '<br />';
                     // we transfert tmp into image_dst
                     $image_dst = $this->imagetransfer($tmp, $image_dst);
                 } else {
                     $this->image_dst_x = $this->image_src_x;
                     $this->image_dst_y = $this->image_src_y;
                 }
                 // crop image (and also crops if image_ratio_crop is used)
                 if (!empty($this->image_crop) || !is_null($ratio_crop)) {
                     if (is_array($this->image_crop)) {
                         $vars = $this->image_crop;
                     } else {
                         $vars = explode(' ', $this->image_crop);
                     }
                     if (sizeof($vars) == 4) {
                         $ct = $vars[0];
                         $cr = $vars[1];
                         $cb = $vars[2];
                         $cl = $vars[3];
                     } else {
                         if (sizeof($vars) == 2) {
                             $ct = $vars[0];
                             $cr = $vars[1];
                             $cb = $vars[0];
                             $cl = $vars[1];
                         } else {
                             $ct = $vars[0];
                             $cr = $vars[0];
                             $cb = $vars[0];
                             $cl = $vars[0];
                         }
                     }
                     if (strpos($ct, '%') > 0) {
                         $ct = $this->image_dst_y * (str_replace('%', '', $ct) / 100);
                     }
                     if (strpos($cr, '%') > 0) {
                         $cr = $this->image_dst_x * (str_replace('%', '', $cr) / 100);
                     }
                     if (strpos($cb, '%') > 0) {
                         $cb = $this->image_dst_y * (str_replace('%', '', $cb) / 100);
                     }
                     if (strpos($cl, '%') > 0) {
                         $cl = $this->image_dst_x * (str_replace('%', '', $cl) / 100);
                     }
                     if (strpos($ct, 'px') > 0) {
                         $ct = str_replace('px', '', $ct);
                     }
                     if (strpos($cr, 'px') > 0) {
                         $cr = str_replace('px', '', $cr);
                     }
                     if (strpos($cb, 'px') > 0) {
                         $cb = str_replace('px', '', $cb);
                     }
                     if (strpos($cl, 'px') > 0) {
                         $cl = str_replace('px', '', $cl);
                     }
                     $ct = (int) $ct;
                     $cr = (int) $cr;
                     $cb = (int) $cb;
                     $cl = (int) $cl;
                     // we adjust the cropping if we use image_ratio_crop
                     if (!is_null($ratio_crop)) {
                         if (array_key_exists('t', $ratio_crop)) {
                             $ct += $ratio_crop['t'];
                         }
                         if (array_key_exists('r', $ratio_crop)) {
                             $cr += $ratio_crop['r'];
                         }
                         if (array_key_exists('b', $ratio_crop)) {
                             $cb += $ratio_crop['b'];
                         }
                         if (array_key_exists('l', $ratio_crop)) {
                             $cl += $ratio_crop['l'];
                         }
                     }
                     $this->log .= '- crop image : ' . $ct . ' ' . $cr . ' ' . $cb . ' ' . $cl . ' <br />';
                     $this->image_dst_x = $this->image_dst_x - $cl - $cr;
                     $this->image_dst_y = $this->image_dst_y - $ct - $cb;
                     if ($this->image_dst_x < 1) {
                         $this->image_dst_x = 1;
                     }
                     if ($this->image_dst_y < 1) {
                         $this->image_dst_y = 1;
                     }
                     $tmp = $this->imagecreatenew($this->image_dst_x, $this->image_dst_y);
                     // we copy the image into the recieving image
                     imagecopy($tmp, $image_dst, 0, 0, $cl, $ct, $this->image_dst_x, $this->image_dst_y);
                     // if we crop with negative margins, we have to make sure the extra bits are the right color, or transparent
                     if ($ct < 0 || $cr < 0 || $cb < 0 || $cl < 0) {
                         // use the background color if present
                         if (!empty($this->image_background_color)) {
                             list($red, $green, $blue) = $this->getcolors($this->image_background_color);
                             $fill = imagecolorallocate($tmp, $red, $green, $blue);
                         } else {
                             $fill = imagecolorallocatealpha($tmp, 0, 0, 0, 127);
                         }
                         // fills eventual negative margins
                         if ($ct < 0) {
                             imagefilledrectangle($tmp, 0, 0, $this->image_dst_x, -$ct - 1, $fill);
                         }
                         if ($cr < 0) {
                             imagefilledrectangle($tmp, $this->image_dst_x + $cr, 0, $this->image_dst_x, $this->image_dst_y, $fill);
                         }
                         if ($cb < 0) {
                             imagefilledrectangle($tmp, 0, $this->image_dst_y + $cb, $this->image_dst_x, $this->image_dst_y, $fill);
                         }
                         if ($cl < 0) {
                             imagefilledrectangle($tmp, 0, 0, -$cl - 1, $this->image_dst_y, $fill);
                         }
                     }
                     // we transfert tmp into image_dst
                     $image_dst = $this->imagetransfer($tmp, $image_dst);
                 }
                 // flip image
                 if ($gd_version >= 2 && !empty($this->image_flip)) {
                     $this->image_flip = strtolower($this->image_flip);
                     $this->log .= '- flip image : ' . $this->image_flip . '<br />';
                     $tmp = $this->imagecreatenew($this->image_dst_x, $this->image_dst_y);
                     for ($x = 0; $x < $this->image_dst_x; $x++) {
                         for ($y = 0; $y < $this->image_dst_y; $y++) {
                             if (strpos($this->image_flip, 'v') !== false) {
                                 imagecopy($tmp, $image_dst, $this->image_dst_x - $x - 1, $y, $x, $y, 1, 1);
                             } else {
                                 imagecopy($tmp, $image_dst, $x, $this->image_dst_y - $y - 1, $x, $y, 1, 1);
                             }
                         }
                     }
                     // we transfert tmp into image_dst
                     $image_dst = $this->imagetransfer($tmp, $image_dst);
                 }
                 // rotate image
                 if ($gd_version >= 2 && is_numeric($this->image_rotate)) {
                     if (!in_array($this->image_rotate, array(0, 90, 180, 270))) {
                         $this->image_rotate = 0;
                     }
                     if ($this->image_rotate != 0) {
                         if ($this->image_rotate == 90 || $this->image_rotate == 270) {
                             $tmp = $this->imagecreatenew($this->image_dst_y, $this->image_dst_x);
                         } else {
                             $tmp = $this->imagecreatenew($this->image_dst_x, $this->image_dst_y);
                         }
                         $this->log .= '- rotate image : ' . $this->image_rotate . '<br />';
                         for ($x = 0; $x < $this->image_dst_x; $x++) {
                             for ($y = 0; $y < $this->image_dst_y; $y++) {
                                 if ($this->image_rotate == 90) {
                                     imagecopy($tmp, $image_dst, $y, $x, $x, $this->image_dst_y - $y - 1, 1, 1);
                                 } else {
                                     if ($this->image_rotate == 180) {
                                         imagecopy($tmp, $image_dst, $x, $y, $this->image_dst_x - $x - 1, $this->image_dst_y - $y - 1, 1, 1);
                                     } else {
                                         if ($this->image_rotate == 270) {
                                             imagecopy($tmp, $image_dst, $y, $x, $this->image_dst_x - $x - 1, $y, 1, 1);
                                         } else {
                                             imagecopy($tmp, $image_dst, $x, $y, $x, $y, 1, 1);
                                         }
                                     }
                                 }
                             }
                         }
                         if ($this->image_rotate == 90 || $this->image_rotate == 270) {
                             $t = $this->image_dst_y;
                             $this->image_dst_y = $this->image_dst_x;
                             $this->image_dst_x = $t;
                         }
                         // we transfert tmp into image_dst
                         $image_dst = $this->imagetransfer($tmp, $image_dst);
                     }
                 }
                 // unsharp mask
                 if ($gd_version >= 2 && $this->image_unsharp && is_numeric($this->image_unsharp_amount) && is_numeric($this->image_unsharp_radius) && is_numeric($this->image_unsharp_threshold)) {
                     // Unsharp Mask for PHP - version 2.1.1
                     // Unsharp mask algorithm by Torstein Hønsi 2003-07.
                     // Used with permission
                     // Modified to support alpha transparency
                     if ($this->image_unsharp_amount > 500) {
                         $this->image_unsharp_amount = 500;
                     }
                     $this->image_unsharp_amount = $this->image_unsharp_amount * 0.016;
                     if ($this->image_unsharp_radius > 50) {
                         $this->image_unsharp_radius = 50;
                     }
                     $this->image_unsharp_radius = $this->image_unsharp_radius * 2;
                     if ($this->image_unsharp_threshold > 255) {
                         $this->image_unsharp_threshold = 255;
                     }
                     $this->image_unsharp_radius = abs(round($this->image_unsharp_radius));
                     if ($this->image_unsharp_radius != 0) {
                         $this->image_dst_x = imagesx($image_dst);
                         $this->image_dst_y = imagesy($image_dst);
                         $canvas = $this->imagecreatenew($this->image_dst_x, $this->image_dst_y, false, true);
                         $blur = $this->imagecreatenew($this->image_dst_x, $this->image_dst_y, false, true);
                         if (function_exists('imageconvolution')) {
                             // PHP >= 5.1
                             $matrix = array(array(1, 2, 1), array(2, 4, 2), array(1, 2, 1));
                             imagecopy($blur, $image_dst, 0, 0, 0, 0, $this->image_dst_x, $this->image_dst_y);
                             imageconvolution($blur, $matrix, 16, 0);
                         } else {
                             for ($i = 0; $i < $this->image_unsharp_radius; $i++) {
                                 imagecopy($blur, $image_dst, 0, 0, 1, 0, $this->image_dst_x - 1, $this->image_dst_y);
                                 // left
                                 $this->imagecopymergealpha($blur, $image_dst, 1, 0, 0, 0, $this->image_dst_x, $this->image_dst_y, 50);
                                 // right
                                 $this->imagecopymergealpha($blur, $image_dst, 0, 0, 0, 0, $this->image_dst_x, $this->image_dst_y, 50);
                                 // center
                                 imagecopy($canvas, $blur, 0, 0, 0, 0, $this->image_dst_x, $this->image_dst_y);
                                 $this->imagecopymergealpha($blur, $canvas, 0, 0, 0, 1, $this->image_dst_x, $this->image_dst_y - 1, 33.33333);
                                 // up
                                 $this->imagecopymergealpha($blur, $canvas, 0, 1, 0, 0, $this->image_dst_x, $this->image_dst_y, 25);
                                 // down
                             }
                         }
                         $p_new = array();
                         if ($this->image_unsharp_threshold > 0) {
                             for ($x = 0; $x < $this->image_dst_x - 1; $x++) {
                                 for ($y = 0; $y < $this->image_dst_y; $y++) {
                                     $p_orig = imagecolorsforindex($image_dst, imagecolorat($image_dst, $x, $y));
                                     $p_blur = imagecolorsforindex($blur, imagecolorat($blur, $x, $y));
                                     $p_new['red'] = abs($p_orig['red'] - $p_blur['red']) >= $this->image_unsharp_threshold ? max(0, min(255, $this->image_unsharp_amount * ($p_orig['red'] - $p_blur['red']) + $p_orig['red'])) : $p_orig['red'];
                                     $p_new['green'] = abs($p_orig['green'] - $p_blur['green']) >= $this->image_unsharp_threshold ? max(0, min(255, $this->image_unsharp_amount * ($p_orig['green'] - $p_blur['green']) + $p_orig['green'])) : $p_orig['green'];
                                     $p_new['blue'] = abs($p_orig['blue'] - $p_blur['blue']) >= $this->image_unsharp_threshold ? max(0, min(255, $this->image_unsharp_amount * ($p_orig['blue'] - $p_blur['blue']) + $p_orig['blue'])) : $p_orig['blue'];
                                     if ($p_orig['red'] != $p_new['red'] || $p_orig['green'] != $p_new['green'] || $p_orig['blue'] != $p_new['blue']) {
                                         $color = imagecolorallocatealpha($image_dst, $p_new['red'], $p_new['green'], $p_new['blue'], $p_orig['alpha']);
                                         imagesetpixel($image_dst, $x, $y, $color);
                                     }
                                 }
                             }
                         } else {
                             for ($x = 0; $x < $this->image_dst_x; $x++) {
                                 for ($y = 0; $y < $this->image_dst_y; $y++) {
                                     $p_orig = imagecolorsforindex($image_dst, imagecolorat($image_dst, $x, $y));
                                     $p_blur = imagecolorsforindex($blur, imagecolorat($blur, $x, $y));
                                     $p_new['red'] = $this->image_unsharp_amount * ($p_orig['red'] - $p_blur['red']) + $p_orig['red'];
                                     if ($p_new['red'] > 255) {
                                         $p_new['red'] = 255;
                                     } elseif ($p_new['red'] < 0) {
                                         $p_new['red'] = 0;
                                     }
                                     $p_new['green'] = $this->image_unsharp_amount * ($p_orig['green'] - $p_blur['green']) + $p_orig['green'];
                                     if ($p_new['green'] > 255) {
                                         $p_new['green'] = 255;
                                     } elseif ($p_new['green'] < 0) {
                                         $p_new['green'] = 0;
                                     }
                                     $p_new['blue'] = $this->image_unsharp_amount * ($p_orig['blue'] - $p_blur['blue']) + $p_orig['blue'];
                                     if ($p_new['blue'] > 255) {
                                         $p_new['blue'] = 255;
                                     } elseif ($p_new['blue'] < 0) {
                                         $p_new['blue'] = 0;
                                     }
                                     $color = imagecolorallocatealpha($image_dst, $p_new['red'], $p_new['green'], $p_new['blue'], $p_orig['alpha']);
                                     imagesetpixel($image_dst, $x, $y, $color);
                                 }
                             }
                         }
                         imagedestroy($canvas);
                         imagedestroy($blur);
                     }
                 }
                 // add color overlay
                 if ($gd_version >= 2 && (is_numeric($this->image_overlay_percent) && $this->image_overlay_percent > 0 && !empty($this->image_overlay_color))) {
                     $this->log .= '- apply color overlay<br />';
                     list($red, $green, $blue) = $this->getcolors($this->image_overlay_color);
                     $filter = imagecreatetruecolor($this->image_dst_x, $this->image_dst_y);
                     $color = imagecolorallocate($filter, $red, $green, $blue);
                     imagefilledrectangle($filter, 0, 0, $this->image_dst_x, $this->image_dst_y, $color);
                     $this->imagecopymergealpha($image_dst, $filter, 0, 0, 0, 0, $this->image_dst_x, $this->image_dst_y, $this->image_overlay_percent);
                     imagedestroy($filter);
                 }
                 // add brightness, contrast and tint, turns to greyscale and inverts colors
                 if ($gd_version >= 2 && ($this->image_negative || $this->image_greyscale || is_numeric($this->image_threshold) || is_numeric($this->image_brightness) || is_numeric($this->image_contrast) || !empty($this->image_tint_color))) {
                     $this->log .= '- apply tint, light, contrast correction, negative, greyscale and threshold<br />';
                     if (!empty($this->image_tint_color)) {
                         list($tint_red, $tint_green, $tint_blue) = $this->getcolors($this->image_tint_color);
                     }
                     imagealphablending($image_dst, true);
                     for ($y = 0; $y < $this->image_dst_y; $y++) {
                         for ($x = 0; $x < $this->image_dst_x; $x++) {
                             if ($this->image_greyscale) {
                                 $pixel = imagecolorsforindex($image_dst, imagecolorat($image_dst, $x, $y));
                                 $r = $g = $b = round(0.2125 * $pixel['red'] + 0.7154 * $pixel['green'] + 0.0721 * $pixel['blue']);
                                 $color = imagecolorallocatealpha($image_dst, $r, $g, $b, $pixel['alpha']);
                                 imagesetpixel($image_dst, $x, $y, $color);
                             }
                             if (is_numeric($this->image_threshold)) {
                                 $pixel = imagecolorsforindex($image_dst, imagecolorat($image_dst, $x, $y));
                                 $c = round($pixel['red'] + $pixel['green'] + $pixel['blue']) / 3 - 127;
                                 $r = $g = $b = $c > $this->image_threshold ? 255 : 0;
                                 $color = imagecolorallocatealpha($image_dst, $r, $g, $b, $pixel['alpha']);
                                 imagesetpixel($image_dst, $x, $y, $color);
                             }
                             if (is_numeric($this->image_brightness)) {
                                 $pixel = imagecolorsforindex($image_dst, imagecolorat($image_dst, $x, $y));
                                 $r = max(min(round($pixel['red'] + $this->image_brightness * 2), 255), 0);
                                 $g = max(min(round($pixel['green'] + $this->image_brightness * 2), 255), 0);
                                 $b = max(min(round($pixel['blue'] + $this->image_brightness * 2), 255), 0);
                                 $color = imagecolorallocatealpha($image_dst, $r, $g, $b, $pixel['alpha']);
                                 imagesetpixel($image_dst, $x, $y, $color);
                             }
                             if (is_numeric($this->image_contrast)) {
                                 $pixel = imagecolorsforindex($image_dst, imagecolorat($image_dst, $x, $y));
                                 $r = max(min(round(($this->image_contrast + 128) * $pixel['red'] / 128), 255), 0);
                                 $g = max(min(round(($this->image_contrast + 128) * $pixel['green'] / 128), 255), 0);
                                 $b = max(min(round(($this->image_contrast + 128) * $pixel['blue'] / 128), 255), 0);
                                 $color = imagecolorallocatealpha($image_dst, $r, $g, $b, $pixel['alpha']);
                                 imagesetpixel($image_dst, $x, $y, $color);
                             }
                             if (!empty($this->image_tint_color)) {
                                 $pixel = imagecolorsforindex($image_dst, imagecolorat($image_dst, $x, $y));
                                 $r = min(round($tint_red * $pixel['red'] / 169), 255);
                                 $g = min(round($tint_green * $pixel['green'] / 169), 255);
                                 $b = min(round($tint_blue * $pixel['blue'] / 169), 255);
                                 $color = imagecolorallocatealpha($image_dst, $r, $g, $b, $pixel['alpha']);
                                 imagesetpixel($image_dst, $x, $y, $color);
                             }
                             if (!empty($this->image_negative)) {
                                 $pixel = imagecolorsforindex($image_dst, imagecolorat($image_dst, $x, $y));
                                 $r = round(255 - $pixel['red']);
                                 $g = round(255 - $pixel['green']);
                                 $b = round(255 - $pixel['blue']);
                                 $color = imagecolorallocatealpha($image_dst, $r, $g, $b, $pixel['alpha']);
                                 imagesetpixel($image_dst, $x, $y, $color);
                             }
                         }
                     }
                 }
                 // adds a border
                 if ($gd_version >= 2 && !empty($this->image_border)) {
                     if (is_array($this->image_border)) {
                         $vars = $this->image_border;
                         $this->log .= '- add border : ' . implode(' ', $this->image_border) . '<br />';
                     } else {
                         $this->log .= '- add border : ' . $this->image_border . '<br />';
                         $vars = explode(' ', $this->image_border);
                     }
                     if (sizeof($vars) == 4) {
                         $ct = $vars[0];
                         $cr = $vars[1];
                         $cb = $vars[2];
                         $cl = $vars[3];
                     } else {
                         if (sizeof($vars) == 2) {
                             $ct = $vars[0];
                             $cr = $vars[1];
                             $cb = $vars[0];
                             $cl = $vars[1];
                         } else {
                             $ct = $vars[0];
                             $cr = $vars[0];
                             $cb = $vars[0];
                             $cl = $vars[0];
                         }
                     }
                     if (strpos($ct, '%') > 0) {
                         $ct = $this->image_dst_y * (str_replace('%', '', $ct) / 100);
                     }
                     if (strpos($cr, '%') > 0) {
                         $cr = $this->image_dst_x * (str_replace('%', '', $cr) / 100);
                     }
                     if (strpos($cb, '%') > 0) {
                         $cb = $this->image_dst_y * (str_replace('%', '', $cb) / 100);
                     }
                     if (strpos($cl, '%') > 0) {
                         $cl = $this->image_dst_x * (str_replace('%', '', $cl) / 100);
                     }
                     if (strpos($ct, 'px') > 0) {
                         $ct = str_replace('px', '', $ct);
                     }
                     if (strpos($cr, 'px') > 0) {
                         $cr = str_replace('px', '', $cr);
                     }
                     if (strpos($cb, 'px') > 0) {
                         $cb = str_replace('px', '', $cb);
                     }
                     if (strpos($cl, 'px') > 0) {
                         $cl = str_replace('px', '', $cl);
                     }
                     $ct = (int) $ct;
                     $cr = (int) $cr;
                     $cb = (int) $cb;
                     $cl = (int) $cl;
                     $this->image_dst_x = $this->image_dst_x + $cl + $cr;
                     $this->image_dst_y = $this->image_dst_y + $ct + $cb;
                     if (!empty($this->image_border_color)) {
                         list($red, $green, $blue) = $this->getcolors($this->image_border_color);
                     }
                     // we now create an image, that we fill with the border color
                     $tmp = $this->imagecreatenew($this->image_dst_x, $this->image_dst_y);
                     $background = imagecolorallocatealpha($tmp, $red, $green, $blue, 0);
                     imagefilledrectangle($tmp, 0, 0, $this->image_dst_x, $this->image_dst_y, $background);
                     // we then copy the source image into the new image, without merging so that only the border is actually kept
                     imagecopy($tmp, $image_dst, $cl, $ct, 0, 0, $this->image_dst_x - $cr - $cl, $this->image_dst_y - $cb - $ct);
                     // we transfert tmp into image_dst
                     $image_dst = $this->imagetransfer($tmp, $image_dst);
                 }
                 // add frame border
                 if (is_numeric($this->image_frame)) {
                     if (is_array($this->image_frame_colors)) {
                         $vars = $this->image_frame_colors;
                         $this->log .= '- add frame : ' . implode(' ', $this->image_frame_colors) . '<br />';
                     } else {
                         $this->log .= '- add frame : ' . $this->image_frame_colors . '<br />';
                         $vars = explode(' ', $this->image_frame_colors);
                     }
                     $nb = sizeof($vars);
                     $this->image_dst_x = $this->image_dst_x + $nb * 2;
                     $this->image_dst_y = $this->image_dst_y + $nb * 2;
                     $tmp = $this->imagecreatenew($this->image_dst_x, $this->image_dst_y);
                     imagecopy($tmp, $image_dst, $nb, $nb, 0, 0, $this->image_dst_x - $nb * 2, $this->image_dst_y - $nb * 2);
                     for ($i = 0; $i < $nb; $i++) {
                         list($red, $green, $blue) = $this->getcolors($vars[$i]);
                         $c = imagecolorallocate($tmp, $red, $green, $blue);
                         if ($this->image_frame == 1) {
                             imageline($tmp, $i, $i, $this->image_dst_x - $i - 1, $i, $c);
                             imageline($tmp, $this->image_dst_x - $i - 1, $this->image_dst_y - $i - 1, $this->image_dst_x - $i - 1, $i, $c);
                             imageline($tmp, $this->image_dst_x - $i - 1, $this->image_dst_y - $i - 1, $i, $this->image_dst_y - $i - 1, $c);
                             imageline($tmp, $i, $i, $i, $this->image_dst_y - $i - 1, $c);
                         } else {
                             imageline($tmp, $i, $i, $this->image_dst_x - $i - 1, $i, $c);
                             imageline($tmp, $this->image_dst_x - $nb + $i, $this->image_dst_y - $nb + $i, $this->image_dst_x - $nb + $i, $nb - $i, $c);
                             imageline($tmp, $this->image_dst_x - $nb + $i, $this->image_dst_y - $nb + $i, $nb - $i, $this->image_dst_y - $nb + $i, $c);
                             imageline($tmp, $i, $i, $i, $this->image_dst_y - $i - 1, $c);
                         }
                     }
                     // we transfert tmp into image_dst
                     $image_dst = $this->imagetransfer($tmp, $image_dst);
                 }
                 // add bevel border
                 if ($this->image_bevel > 0) {
                     if (empty($this->image_bevel_color1)) {
                         $this->image_bevel_color1 = '#FFFFFF';
                     }
                     if (empty($this->image_bevel_color2)) {
                         $this->image_bevel_color2 = '#000000';
                     }
                     list($red1, $green1, $blue1) = $this->getcolors($this->image_bevel_color1);
                     list($red2, $green2, $blue2) = $this->getcolors($this->image_bevel_color2);
                     $tmp = $this->imagecreatenew($this->image_dst_x, $this->image_dst_y);
                     imagecopy($tmp, $image_dst, 0, 0, 0, 0, $this->image_dst_x, $this->image_dst_y);
                     imagealphablending($tmp, true);
                     for ($i = 0; $i < $this->image_bevel; $i++) {
                         $alpha = round($i / $this->image_bevel * 127);
                         $c1 = imagecolorallocatealpha($tmp, $red1, $green1, $blue1, $alpha);
                         $c2 = imagecolorallocatealpha($tmp, $red2, $green2, $blue2, $alpha);
                         imageline($tmp, $i, $i, $this->image_dst_x - $i - 1, $i, $c1);
                         imageline($tmp, $this->image_dst_x - $i - 1, $this->image_dst_y - $i, $this->image_dst_x - $i - 1, $i, $c2);
                         imageline($tmp, $this->image_dst_x - $i - 1, $this->image_dst_y - $i - 1, $i, $this->image_dst_y - $i - 1, $c2);
                         imageline($tmp, $i, $i, $i, $this->image_dst_y - $i - 1, $c1);
                     }
                     // we transfert tmp into image_dst
                     $image_dst = $this->imagetransfer($tmp, $image_dst);
                 }
                 // add watermark image
                 if ($this->image_watermark != '' && file_exists($this->image_watermark)) {
                     $this->log .= '- add watermark<br />';
                     $this->image_watermark_position = strtolower($this->image_watermark_position);
                     $watermark_info = getimagesize($this->image_watermark);
                     $watermark_type = array_key_exists(2, $watermark_info) ? $watermark_info[2] : null;
                     // 1 = GIF, 2 = JPG, 3 = PNG
                     $watermark_checked = false;
                     if ($watermark_type == IMAGETYPE_GIF) {
                         if (!function_exists('imagecreatefromgif')) {
                             $this->error = $this->translate('watermark_no_create_support', array('GIF'));
                         } else {
                             $filter = @imagecreatefromgif($this->image_watermark);
                             if (!$filter) {
                                 $this->error = $this->translate('watermark_create_error', array('GIF'));
                             } else {
                                 $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;watermark source image is GIF<br />';
                                 $watermark_checked = true;
                             }
                         }
                     } else {
                         if ($watermark_type == IMAGETYPE_JPEG) {
                             if (!function_exists('imagecreatefromjpeg')) {
                                 $this->error = $this->translate('watermark_no_create_support', array('JPEG'));
                             } else {
                                 $filter = @imagecreatefromjpeg($this->image_watermark);
                                 if (!$filter) {
                                     $this->error = $this->translate('watermark_create_error', array('JPEG'));
                                 } else {
                                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;watermark source image is JPEG<br />';
                                     $watermark_checked = true;
                                 }
                             }
                         } else {
                             if ($watermark_type == IMAGETYPE_PNG) {
                                 if (!function_exists('imagecreatefrompng')) {
                                     $this->error = $this->translate('watermark_no_create_support', array('PNG'));
                                 } else {
                                     $filter = @imagecreatefrompng($this->image_watermark);
                                     if (!$filter) {
                                         $this->error = $this->translate('watermark_create_error', array('PNG'));
                                     } else {
                                         $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;watermark source image is PNG<br />';
                                         $watermark_checked = true;
                                     }
                                 }
                             } else {
                                 if ($watermark_type == IMAGETYPE_BMP) {
                                     if (!method_exists($this, 'imagecreatefrombmp')) {
                                         $this->error = $this->translate('watermark_no_create_support', array('BMP'));
                                     } else {
                                         $filter = @$this->imagecreatefrombmp($this->image_watermark);
                                         if (!$filter) {
                                             $this->error = $this->translate('watermark_create_error', array('BMP'));
                                         } else {
                                             $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;watermark source image is BMP<br />';
                                             $watermark_checked = true;
                                         }
                                     }
                                 } else {
                                     $this->error = $this->translate('watermark_invalid');
                                 }
                             }
                         }
                     }
                     if ($watermark_checked) {
                         $watermark_dst_width = $watermark_src_width = imagesx($filter);
                         $watermark_dst_height = $watermark_src_height = imagesy($filter);
                         // if watermark is too large/tall, resize it first
                         if (!$this->image_watermark_no_zoom_out && ($watermark_dst_width > $this->image_dst_x || $watermark_dst_height > $this->image_dst_y) || !$this->image_watermark_no_zoom_in && $watermark_dst_width < $this->image_dst_x && $watermark_dst_height < $this->image_dst_y) {
                             $canvas_width = $this->image_dst_x - abs($this->image_watermark_x);
                             $canvas_height = $this->image_dst_y - abs($this->image_watermark_y);
                             if ($watermark_src_width / $canvas_width > $watermark_src_height / $canvas_height) {
                                 $watermark_dst_width = $canvas_width;
                                 $watermark_dst_height = intval($watermark_src_height * ($canvas_width / $watermark_src_width));
                             } else {
                                 $watermark_dst_height = $canvas_height;
                                 $watermark_dst_width = intval($watermark_src_width * ($canvas_height / $watermark_src_height));
                             }
                             $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;watermark resized from ' . $watermark_src_width . 'x' . $watermark_src_height . ' to ' . $watermark_dst_width . 'x' . $watermark_dst_height . '<br />';
                         }
                         // determine watermark position
                         $watermark_x = 0;
                         $watermark_y = 0;
                         if (is_numeric($this->image_watermark_x)) {
                             if ($this->image_watermark_x < 0) {
                                 $watermark_x = $this->image_dst_x - $watermark_dst_width + $this->image_watermark_x;
                             } else {
                                 $watermark_x = $this->image_watermark_x;
                             }
                         } else {
                             if (strpos($this->image_watermark_position, 'r') !== false) {
                                 $watermark_x = $this->image_dst_x - $watermark_dst_width;
                             } else {
                                 if (strpos($this->image_watermark_position, 'l') !== false) {
                                     $watermark_x = 0;
                                 } else {
                                     $watermark_x = ($this->image_dst_x - $watermark_dst_width) / 2;
                                 }
                             }
                         }
                         if (is_numeric($this->image_watermark_y)) {
                             if ($this->image_watermark_y < 0) {
                                 $watermark_y = $this->image_dst_y - $watermark_dst_height + $this->image_watermark_y;
                             } else {
                                 $watermark_y = $this->image_watermark_y;
                             }
                         } else {
                             if (strpos($this->image_watermark_position, 'b') !== false) {
                                 $watermark_y = $this->image_dst_y - $watermark_dst_height;
                             } else {
                                 if (strpos($this->image_watermark_position, 't') !== false) {
                                     $watermark_y = 0;
                                 } else {
                                     $watermark_y = ($this->image_dst_y - $watermark_dst_height) / 2;
                                 }
                             }
                         }
                         imagealphablending($image_dst, true);
                         imagecopyresampled($image_dst, $filter, $watermark_x, $watermark_y, 0, 0, $watermark_dst_width, $watermark_dst_height, $watermark_src_width, $watermark_src_height);
                     } else {
                         $this->error = $this->translate('watermark_invalid');
                     }
                 }
                 // add text
                 if (!empty($this->image_text)) {
                     $this->log .= '- add text<br />';
                     // calculate sizes in human readable format
                     $src_size = $this->file_src_size / 1024;
                     $src_size_mb = number_format($src_size / 1024, 1, ".", " ");
                     $src_size_kb = number_format($src_size, 1, ".", " ");
                     $src_size_human = $src_size > 1024 ? $src_size_mb . " MB" : $src_size_kb . " kb";
                     $this->image_text = str_replace(array('[src_name]', '[src_name_body]', '[src_name_ext]', '[src_pathname]', '[src_mime]', '[src_size]', '[src_size_kb]', '[src_size_mb]', '[src_size_human]', '[src_x]', '[src_y]', '[src_pixels]', '[src_type]', '[src_bits]', '[dst_path]', '[dst_name_body]', '[dst_name_ext]', '[dst_name]', '[dst_pathname]', '[dst_x]', '[dst_y]', '[date]', '[time]', '[host]', '[server]', '[ip]', '[gd_version]'), array($this->file_src_name, $this->file_src_name_body, $this->file_src_name_ext, $this->file_src_pathname, $this->file_src_mime, $this->file_src_size, $src_size_kb, $src_size_mb, $src_size_human, $this->image_src_x, $this->image_src_y, $this->image_src_pixels, $this->image_src_type, $this->image_src_bits, $this->file_dst_path, $this->file_dst_name_body, $this->file_dst_name_ext, $this->file_dst_name, $this->file_dst_pathname, $this->image_dst_x, $this->image_dst_y, date('Y-m-d'), date('H:i:s'), isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'n/a', isset($_SERVER['SERVER_NAME']) ? $_SERVER['SERVER_NAME'] : 'n/a', isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : 'n/a', $this->gdversion(true)), $this->image_text);
                     if (!is_numeric($this->image_text_padding)) {
                         $this->image_text_padding = 0;
                     }
                     if (!is_numeric($this->image_text_line_spacing)) {
                         $this->image_text_line_spacing = 0;
                     }
                     if (!is_numeric($this->image_text_padding_x)) {
                         $this->image_text_padding_x = $this->image_text_padding;
                     }
                     if (!is_numeric($this->image_text_padding_y)) {
                         $this->image_text_padding_y = $this->image_text_padding;
                     }
                     $this->image_text_position = strtolower($this->image_text_position);
                     $this->image_text_direction = strtolower($this->image_text_direction);
                     $this->image_text_alignment = strtolower($this->image_text_alignment);
                     // if the font is a string, we assume that we might want to load a font
                     if (!is_numeric($this->image_text_font) && strlen($this->image_text_font) > 4 && substr(strtolower($this->image_text_font), -4) == '.gdf') {
                         $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;try to load font ' . $this->image_text_font . '... ';
                         if ($this->image_text_font = @imageloadfont($this->image_text_font)) {
                             $this->log .= 'success<br />';
                         } else {
                             $this->log .= 'error<br />';
                             $this->image_text_font = 5;
                         }
                     }
                     $text = explode("\n", $this->image_text);
                     $char_width = imagefontwidth($this->image_text_font);
                     $char_height = imagefontheight($this->image_text_font);
                     $text_height = 0;
                     $text_width = 0;
                     $line_height = 0;
                     $line_width = 0;
                     foreach ($text as $k => $v) {
                         if ($this->image_text_direction == 'v') {
                             $h = $char_width * strlen($v);
                             if ($h > $text_height) {
                                 $text_height = $h;
                             }
                             $line_width = $char_height;
                             $text_width += $line_width + ($k < sizeof($text) - 1 ? $this->image_text_line_spacing : 0);
                         } else {
                             $w = $char_width * strlen($v);
                             if ($w > $text_width) {
                                 $text_width = $w;
                             }
                             $line_height = $char_height;
                             $text_height += $line_height + ($k < sizeof($text) - 1 ? $this->image_text_line_spacing : 0);
                         }
                     }
                     $text_width += 2 * $this->image_text_padding_x;
                     $text_height += 2 * $this->image_text_padding_y;
                     $text_x = 0;
                     $text_y = 0;
                     if (is_numeric($this->image_text_x)) {
                         if ($this->image_text_x < 0) {
                             $text_x = $this->image_dst_x - $text_width + $this->image_text_x;
                         } else {
                             $text_x = $this->image_text_x;
                         }
                     } else {
                         if (strpos($this->image_text_position, 'r') !== false) {
                             $text_x = $this->image_dst_x - $text_width;
                         } else {
                             if (strpos($this->image_text_position, 'l') !== false) {
                                 $text_x = 0;
                             } else {
                                 $text_x = ($this->image_dst_x - $text_width) / 2;
                             }
                         }
                     }
                     if (is_numeric($this->image_text_y)) {
                         if ($this->image_text_y < 0) {
                             $text_y = $this->image_dst_y - $text_height + $this->image_text_y;
                         } else {
                             $text_y = $this->image_text_y;
                         }
                     } else {
                         if (strpos($this->image_text_position, 'b') !== false) {
                             $text_y = $this->image_dst_y - $text_height;
                         } else {
                             if (strpos($this->image_text_position, 't') !== false) {
                                 $text_y = 0;
                             } else {
                                 $text_y = ($this->image_dst_y - $text_height) / 2;
                             }
                         }
                     }
                     // add a background, maybe transparent
                     if (!empty($this->image_text_background)) {
                         list($red, $green, $blue) = $this->getcolors($this->image_text_background);
                         if ($gd_version >= 2 && is_numeric($this->image_text_background_percent) && $this->image_text_background_percent >= 0 && $this->image_text_background_percent <= 100) {
                             $filter = imagecreatetruecolor($text_width, $text_height);
                             $background_color = imagecolorallocate($filter, $red, $green, $blue);
                             imagefilledrectangle($filter, 0, 0, $text_width, $text_height, $background_color);
                             $this->imagecopymergealpha($image_dst, $filter, $text_x, $text_y, 0, 0, $text_width, $text_height, $this->image_text_background_percent);
                             imagedestroy($filter);
                         } else {
                             $background_color = imagecolorallocate($image_dst, $red, $green, $blue);
                             imagefilledrectangle($image_dst, $text_x, $text_y, $text_x + $text_width, $text_y + $text_height, $background_color);
                         }
                     }
                     $text_x += $this->image_text_padding_x;
                     $text_y += $this->image_text_padding_y;
                     $t_width = $text_width - 2 * $this->image_text_padding_x;
                     $t_height = $text_height - 2 * $this->image_text_padding_y;
                     list($red, $green, $blue) = $this->getcolors($this->image_text_color);
                     // add the text, maybe transparent
                     if ($gd_version >= 2 && is_numeric($this->image_text_percent) && $this->image_text_percent >= 0 && $this->image_text_percent <= 100) {
                         if ($t_width < 0) {
                             $t_width = 0;
                         }
                         if ($t_height < 0) {
                             $t_height = 0;
                         }
                         $filter = $this->imagecreatenew($t_width, $t_height, false, true);
                         $text_color = imagecolorallocate($filter, $red, $green, $blue);
                         foreach ($text as $k => $v) {
                             if ($this->image_text_direction == 'v') {
                                 imagestringup($filter, $this->image_text_font, $k * ($line_width + ($k > 0 && $k < sizeof($text) ? $this->image_text_line_spacing : 0)), $text_height - 2 * $this->image_text_padding_y - ($this->image_text_alignment == 'l' ? 0 : ($t_height - strlen($v) * $char_width) / ($this->image_text_alignment == 'r' ? 1 : 2)), $v, $text_color);
                             } else {
                                 imagestring($filter, $this->image_text_font, $this->image_text_alignment == 'l' ? 0 : ($t_width - strlen($v) * $char_width) / ($this->image_text_alignment == 'r' ? 1 : 2), $k * ($line_height + ($k > 0 && $k < sizeof($text) ? $this->image_text_line_spacing : 0)), $v, $text_color);
                             }
                         }
                         $this->imagecopymergealpha($image_dst, $filter, $text_x, $text_y, 0, 0, $t_width, $t_height, $this->image_text_percent);
                         imagedestroy($filter);
                     } else {
                         $text_color = imageColorAllocate($image_dst, $red, $green, $blue);
                         foreach ($text as $k => $v) {
                             if ($this->image_text_direction == 'v') {
                                 imagestringup($image_dst, $this->image_text_font, $text_x + $k * ($line_width + ($k > 0 && $k < sizeof($text) ? $this->image_text_line_spacing : 0)), $text_y + $text_height - 2 * $this->image_text_padding_y - ($this->image_text_alignment == 'l' ? 0 : ($t_height - strlen($v) * $char_width) / ($this->image_text_alignment == 'r' ? 1 : 2)), $v, $text_color);
                             } else {
                                 imagestring($image_dst, $this->image_text_font, $text_x + ($this->image_text_alignment == 'l' ? 0 : ($t_width - strlen($v) * $char_width) / ($this->image_text_alignment == 'r' ? 1 : 2)), $text_y + $k * ($line_height + ($k > 0 && $k < sizeof($text) ? $this->image_text_line_spacing : 0)), $v, $text_color);
                             }
                         }
                     }
                 }
                 // add a reflection
                 if ($this->image_reflection_height) {
                     $this->log .= '- add reflection : ' . $this->image_reflection_height . '<br />';
                     // we decode image_reflection_height, which can be a integer, a string in pixels or percentage
                     $image_reflection_height = $this->image_reflection_height;
                     if (strpos($image_reflection_height, '%') > 0) {
                         $image_reflection_height = $this->image_dst_y * str_replace('%', '', $image_reflection_height / 100);
                     }
                     if (strpos($image_reflection_height, 'px') > 0) {
                         $image_reflection_height = str_replace('px', '', $image_reflection_height);
                     }
                     $image_reflection_height = (int) $image_reflection_height;
                     if ($image_reflection_height > $this->image_dst_y) {
                         $image_reflection_height = $this->image_dst_y;
                     }
                     if (empty($this->image_reflection_opacity)) {
                         $this->image_reflection_opacity = 60;
                     }
                     // create the new destination image
                     $tmp = $this->imagecreatenew($this->image_dst_x, $this->image_dst_y + $image_reflection_height + $this->image_reflection_space, true);
                     $transparency = $this->image_reflection_opacity;
                     // copy the original image
                     imagecopy($tmp, $image_dst, 0, 0, 0, 0, $this->image_dst_x, $this->image_dst_y + ($this->image_reflection_space < 0 ? $this->image_reflection_space : 0));
                     // we have to make sure the extra bit is the right color, or transparent
                     if ($image_reflection_height + $this->image_reflection_space > 0) {
                         // use the background color if present
                         if (!empty($this->image_background_color)) {
                             list($red, $green, $blue) = $this->getcolors($this->image_background_color);
                             $fill = imagecolorallocate($tmp, $red, $green, $blue);
                         } else {
                             $fill = imagecolorallocatealpha($tmp, 0, 0, 0, 127);
                         }
                         // fill in from the edge of the extra bit
                         imagefill($tmp, round($this->image_dst_x / 2), $this->image_dst_y + $image_reflection_height + $this->image_reflection_space - 1, $fill);
                     }
                     // copy the reflection
                     for ($y = 0; $y < $image_reflection_height; $y++) {
                         for ($x = 0; $x < $this->image_dst_x; $x++) {
                             $pixel_b = imagecolorsforindex($tmp, imagecolorat($tmp, $x, $y + $this->image_dst_y + $this->image_reflection_space));
                             $pixel_o = imagecolorsforindex($image_dst, imagecolorat($image_dst, $x, $this->image_dst_y - $y - 1 + ($this->image_reflection_space < 0 ? $this->image_reflection_space : 0)));
                             $alpha_o = 1 - $pixel_o['alpha'] / 127;
                             $alpha_b = 1 - $pixel_b['alpha'] / 127;
                             $opacity = $alpha_o * $transparency / 100;
                             if ($opacity > 0) {
                                 $red = round(($pixel_o['red'] * $opacity + $pixel_b['red'] * $alpha_b) / ($alpha_b + $opacity));
                                 $green = round(($pixel_o['green'] * $opacity + $pixel_b['green'] * $alpha_b) / ($alpha_b + $opacity));
                                 $blue = round(($pixel_o['blue'] * $opacity + $pixel_b['blue'] * $alpha_b) / ($alpha_b + $opacity));
                                 $alpha = $opacity + $alpha_b;
                                 if ($alpha > 1) {
                                     $alpha = 1;
                                 }
                                 $alpha = round((1 - $alpha) * 127);
                                 $color = imagecolorallocatealpha($tmp, $red, $green, $blue, $alpha);
                                 imagesetpixel($tmp, $x, $y + $this->image_dst_y + $this->image_reflection_space, $color);
                             }
                         }
                         if ($transparency > 0) {
                             $transparency = $transparency - $this->image_reflection_opacity / $image_reflection_height;
                         }
                     }
                     // copy the resulting image into the destination image
                     $this->image_dst_y = $this->image_dst_y + $image_reflection_height + $this->image_reflection_space;
                     $image_dst = $this->imagetransfer($tmp, $image_dst);
                 }
                 // reduce the JPEG image to a set desired size
                 if (is_numeric($this->jpeg_size) && $this->jpeg_size > 0 && ($this->image_convert == 'jpeg' || $this->image_convert == 'jpg')) {
                     // inspired by: JPEGReducer class version 1, 25 November 2004, Author: Huda M ElMatsani, justhuda at netscape dot net
                     $this->log .= '- JPEG desired file size : ' . $this->jpeg_size . '<br />';
                     // calculate size of each image. 75%, 50%, and 25% quality
                     ob_start();
                     imagejpeg($image_dst, '', 75);
                     $buffer = ob_get_contents();
                     ob_end_clean();
                     $size75 = strlen($buffer);
                     ob_start();
                     imagejpeg($image_dst, '', 50);
                     $buffer = ob_get_contents();
                     ob_end_clean();
                     $size50 = strlen($buffer);
                     ob_start();
                     imagejpeg($image_dst, '', 25);
                     $buffer = ob_get_contents();
                     ob_end_clean();
                     $size25 = strlen($buffer);
                     // calculate gradient of size reduction by quality
                     $mgrad1 = 25 / ($size50 - $size25);
                     $mgrad2 = 25 / ($size75 - $size50);
                     $mgrad3 = 50 / ($size75 - $size25);
                     $mgrad = ($mgrad1 + $mgrad2 + $mgrad3) / 3;
                     // result of approx. quality factor for expected size
                     $q_factor = round($mgrad * ($this->jpeg_size - $size50) + 50);
                     if ($q_factor < 1) {
                         $this->jpeg_quality = 1;
                     } elseif ($q_factor > 100) {
                         $this->jpeg_quality = 100;
                     } else {
                         $this->jpeg_quality = $q_factor;
                     }
                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;JPEG quality factor set to ' . $this->jpeg_quality . '<br />';
                 }
                 // converts image from true color, and fix transparency if needed
                 $this->log .= '- converting...<br />';
                 switch ($this->image_convert) {
                     case 'gif':
                         // if the image is true color, we convert it to a palette
                         if (imageistruecolor($image_dst)) {
                             $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;true color to palette<br />';
                             // creates a black and white mask
                             $mask = array(array());
                             for ($x = 0; $x < $this->image_dst_x; $x++) {
                                 for ($y = 0; $y < $this->image_dst_y; $y++) {
                                     $pixel = imagecolorsforindex($image_dst, imagecolorat($image_dst, $x, $y));
                                     $mask[$x][$y] = $pixel['alpha'];
                                 }
                             }
                             list($red, $green, $blue) = $this->getcolors($this->image_default_color);
                             // first, we merge the image with the background color, so we know which colors we will have
                             for ($x = 0; $x < $this->image_dst_x; $x++) {
                                 for ($y = 0; $y < $this->image_dst_y; $y++) {
                                     if ($mask[$x][$y] > 0) {
                                         // we have some transparency. we combine the color with the default color
                                         $pixel = imagecolorsforindex($image_dst, imagecolorat($image_dst, $x, $y));
                                         $alpha = $mask[$x][$y] / 127;
                                         $pixel['red'] = round($pixel['red'] * (1 - $alpha) + $red * $alpha);
                                         $pixel['green'] = round($pixel['green'] * (1 - $alpha) + $green * $alpha);
                                         $pixel['blue'] = round($pixel['blue'] * (1 - $alpha) + $blue * $alpha);
                                         $color = imagecolorallocate($image_dst, $pixel['red'], $pixel['green'], $pixel['blue']);
                                         imagesetpixel($image_dst, $x, $y, $color);
                                     }
                                 }
                             }
                             // transforms the true color image into palette, with its merged default color
                             if (empty($this->image_background_color)) {
                                 imagetruecolortopalette($image_dst, true, 255);
                                 $transparency = imagecolorallocate($image_dst, 254, 1, 253);
                                 imagecolortransparent($image_dst, $transparency);
                                 // make the transparent areas transparent
                                 for ($x = 0; $x < $this->image_dst_x; $x++) {
                                     for ($y = 0; $y < $this->image_dst_y; $y++) {
                                         // we test wether we have enough opacity to justify keeping the color
                                         if ($mask[$x][$y] > 120) {
                                             imagesetpixel($image_dst, $x, $y, $transparency);
                                         }
                                     }
                                 }
                             }
                             unset($mask);
                         }
                         break;
                     case 'jpg':
                     case 'bmp':
                         // if the image doesn't support any transparency, then we merge it with the default color
                         $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;fills in transparency with default color<br />';
                         list($red, $green, $blue) = $this->getcolors($this->image_default_color);
                         $transparency = imagecolorallocate($image_dst, $red, $green, $blue);
                         // make the transaparent areas transparent
                         for ($x = 0; $x < $this->image_dst_x; $x++) {
                             for ($y = 0; $y < $this->image_dst_y; $y++) {
                                 // we test wether we have some transparency, in which case we will merge the colors
                                 if (imageistruecolor($image_dst)) {
                                     $rgba = imagecolorat($image_dst, $x, $y);
                                     $pixel = array('red' => $rgba >> 16 & 0xff, 'green' => $rgba >> 8 & 0xff, 'blue' => $rgba & 0xff, 'alpha' => ($rgba & 0x7f000000) >> 24);
                                 } else {
                                     $pixel = imagecolorsforindex($image_dst, imagecolorat($image_dst, $x, $y));
                                 }
                                 if ($pixel['alpha'] == 127) {
                                     // we have full transparency. we make the pixel transparent
                                     imagesetpixel($image_dst, $x, $y, $transparency);
                                 } else {
                                     if ($pixel['alpha'] > 0) {
                                         // we have some transparency. we combine the color with the default color
                                         $alpha = $pixel['alpha'] / 127;
                                         $pixel['red'] = round($pixel['red'] * (1 - $alpha) + $red * $alpha);
                                         $pixel['green'] = round($pixel['green'] * (1 - $alpha) + $green * $alpha);
                                         $pixel['blue'] = round($pixel['blue'] * (1 - $alpha) + $blue * $alpha);
                                         $color = imagecolorclosest($image_dst, $pixel['red'], $pixel['green'], $pixel['blue']);
                                         imagesetpixel($image_dst, $x, $y, $color);
                                     }
                                 }
                             }
                         }
                         break;
                     default:
                         break;
                 }
                 // outputs image
                 $this->log .= '- saving image...<br />';
                 switch ($this->image_convert) {
                     case 'jpeg':
                     case 'jpg':
                         if (!$return_mode) {
                             $result = @imagejpeg($image_dst, $this->file_dst_pathname, $this->jpeg_quality);
                         } else {
                             ob_start();
                             $result = @imagejpeg($image_dst, '', $this->jpeg_quality);
                             $return_content = ob_get_contents();
                             ob_end_clean();
                         }
                         if (!$result) {
                             $this->processed = false;
                             $this->error = $this->translate('file_create', array('JPEG'));
                         } else {
                             $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;JPEG image created<br />';
                         }
                         break;
                     case 'png':
                         imagealphablending($image_dst, false);
                         imagesavealpha($image_dst, true);
                         if (!$return_mode) {
                             $result = @imagepng($image_dst, $this->file_dst_pathname);
                         } else {
                             ob_start();
                             $result = @imagepng($image_dst);
                             $return_content = ob_get_contents();
                             ob_end_clean();
                         }
                         if (!$result) {
                             $this->processed = false;
                             $this->error = $this->translate('file_create', array('PNG'));
                         } else {
                             $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;PNG image created<br />';
                         }
                         break;
                     case 'gif':
                         if (!$return_mode) {
                             $result = @imagegif($image_dst, $this->file_dst_pathname);
                         } else {
                             ob_start();
                             $result = @imagegif($image_dst);
                             $return_content = ob_get_contents();
                             ob_end_clean();
                         }
                         if (!$result) {
                             $this->processed = false;
                             $this->error = $this->translate('file_create', array('GIF'));
                         } else {
                             $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;GIF image created<br />';
                         }
                         break;
                     case 'bmp':
                         if (!$return_mode) {
                             $result = $this->imagebmp($image_dst, $this->file_dst_pathname);
                         } else {
                             ob_start();
                             $result = $this->imagebmp($image_dst);
                             $return_content = ob_get_contents();
                             ob_end_clean();
                         }
                         if (!$result) {
                             $this->processed = false;
                             $this->error = $this->translate('file_create', array('BMP'));
                         } else {
                             $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;BMP image created<br />';
                         }
                         break;
                     default:
                         $this->processed = false;
                         $this->error = $this->translate('no_conversion_type');
                 }
                 if ($this->processed) {
                     if (is_resource($image_src)) {
                         imagedestroy($image_src);
                     }
                     if (is_resource($image_dst)) {
                         imagedestroy($image_dst);
                     }
                     $this->log .= '&nbsp;&nbsp;&nbsp;&nbsp;image objects destroyed<br />';
                 }
             }
         } else {
             $this->log .= '- no image processing wanted<br />';
             if (!$return_mode) {
                 // copy the file to its final destination. we don't use move_uploaded_file here
                 // if we happen to have open_basedir restrictions, it is a temp file that we copy, not the original uploaded file
                 if (!copy($this->file_src_pathname, $this->file_dst_pathname)) {
                     $this->processed = false;
                     $this->error = $this->translate('copy_failed');
                 }
             } else {
                 // returns the file, so that its content can be received by the caller
                 $return_content = @file_get_contents($this->file_src_pathname);
                 if ($return_content === FALSE) {
                     $this->processed = false;
                     $this->error = $this->translate('reading_failed');
                 }
             }
         }
     }
     if ($this->processed) {
         $this->log .= '- <b>process OK</b><br />';
     } else {
         $this->log .= '- <b>error</b>: ' . $this->error . '<br />';
     }
     // we reinit all the vars
     $this->init();
     // we may return the image content
     if ($return_mode) {
         return $return_content;
     }
 }