public function Smooth(&$gdimg, $amount = 6) { $amount = min(25, max(0, $amount)); if ($amount == 0) { return true; } if (phpthumb_functions::version_compare_replacement(phpversion(), '5.0.0', '>=') && phpthumb_functions::gd_is_bundled()) { if (ImageFilter($gdimg, IMG_FILTER_SMOOTH, $amount)) { return true; } $this->DebugMessage('FAILED: ImageFilter($gdimg, IMG_FILTER_SMOOTH, ' . $amount . ')', __FILE__, __LINE__); // fall through and try it the hard way } // currently not implemented "the hard way" $this->DebugMessage('FAILED: phpthumb_filters::Smooth($gdimg, ' . $amount . ') [function not implemented]', __FILE__, __LINE__); return false; }
function applyUnsharpMask(&$img, $amount, $radius, $threshold) { // $img is an image that is already created within php using // imgcreatetruecolor. No url! $img must be a truecolor image. // Attempt to calibrate the parameters to Photoshop: $amount = min($amount, 500); $amount = $amount * 0.016; if ($amount == 0) { return true; } $radius = min($radius, 50); $radius = $radius * 2; $threshold = min($threshold, 255); $radius = abs(round($radius)); // Only integers make sense. if ($radius == 0) { return true; } $w = ImageSX($img); $h = ImageSY($img); $imgCanvas = ImageCreateTrueColor($w, $h); $imgCanvas2 = ImageCreateTrueColor($w, $h); ImageCopy($imgCanvas, $img, 0, 0, 0, 0, $w, $h); ImageCopy($imgCanvas2, $img, 0, 0, 0, 0, $w, $h); $builtinFilterSucceeded = false; if ($radius == 1) { if (phpthumb_functions::version_compare_replacement(phpversion(), '5.0.0', '>=') && phpthumb_functions::gd_is_bundled()) { if (ImageFilter($imgCanvas, IMG_FILTER_GAUSSIAN_BLUR) && ImageFilter($imgCanvas2, IMG_FILTER_GAUSSIAN_BLUR)) { $builtinFilterSucceeded = true; } } } if (!$builtinFilterSucceeded) { $imgBlur = ImageCreateTrueColor($w, $h); $imgBlur2 = ImageCreateTrueColor($w, $h); /////////////////////////// // // Gaussian blur matrix: // 1 2 1 // 2 4 2 // 1 2 1 // /////////////////////////// // Move copies of the image around one pixel at the time and merge them with weight // according to the matrix. The same matrix is simply repeated for higher radii. for ($i = 0; $i < $radius; $i++) { ImageCopy($imgBlur, $imgCanvas, 0, 0, 1, 1, $w - 1, $h - 1); // up left ImageCopyMerge($imgBlur, $imgCanvas, 1, 1, 0, 0, $w, $h, 50); // down right ImageCopyMerge($imgBlur, $imgCanvas, 0, 1, 1, 0, $w - 1, $h, 33.33333); // down left ImageCopyMerge($imgBlur, $imgCanvas, 1, 0, 0, 1, $w, $h - 1, 25); // up right ImageCopyMerge($imgBlur, $imgCanvas, 0, 0, 1, 0, $w - 1, $h, 33.33333); // left ImageCopyMerge($imgBlur, $imgCanvas, 1, 0, 0, 0, $w, $h, 25); // right ImageCopyMerge($imgBlur, $imgCanvas, 0, 0, 0, 1, $w, $h - 1, 20); // up ImageCopyMerge($imgBlur, $imgCanvas, 0, 1, 0, 0, $w, $h, 16.666667); // down ImageCopyMerge($imgBlur, $imgCanvas, 0, 0, 0, 0, $w, $h, 50); // center ImageCopy($imgCanvas, $imgBlur, 0, 0, 0, 0, $w, $h); // During the loop above the blurred copy darkens, possibly due to a roundoff // error. Therefore the sharp picture has to go through the same loop to // produce a similar image for comparison. This is not a good thing, as processing // time increases heavily. ImageCopy($imgBlur2, $imgCanvas2, 0, 0, 0, 0, $w, $h); ImageCopyMerge($imgBlur2, $imgCanvas2, 0, 0, 0, 0, $w, $h, 50); ImageCopyMerge($imgBlur2, $imgCanvas2, 0, 0, 0, 0, $w, $h, 33.33333); ImageCopyMerge($imgBlur2, $imgCanvas2, 0, 0, 0, 0, $w, $h, 25); ImageCopyMerge($imgBlur2, $imgCanvas2, 0, 0, 0, 0, $w, $h, 33.33333); ImageCopyMerge($imgBlur2, $imgCanvas2, 0, 0, 0, 0, $w, $h, 25); ImageCopyMerge($imgBlur2, $imgCanvas2, 0, 0, 0, 0, $w, $h, 20); ImageCopyMerge($imgBlur2, $imgCanvas2, 0, 0, 0, 0, $w, $h, 16.666667); ImageCopyMerge($imgBlur2, $imgCanvas2, 0, 0, 0, 0, $w, $h, 50); ImageCopy($imgCanvas2, $imgBlur2, 0, 0, 0, 0, $w, $h); } ImageDestroy($imgBlur); ImageDestroy($imgBlur2); } // Calculate the difference between the blurred pixels and the original // and set the pixels for ($x = 0; $x < $w; $x++) { // each row for ($y = 0; $y < $h; $y++) { // each pixel $rgbOrig = ImageColorAt($imgCanvas2, $x, $y); $rOrig = $rgbOrig >> 16 & 0xff; $gOrig = $rgbOrig >> 8 & 0xff; $bOrig = $rgbOrig & 0xff; $rgbBlur = ImageColorAt($imgCanvas, $x, $y); $rBlur = $rgbBlur >> 16 & 0xff; $gBlur = $rgbBlur >> 8 & 0xff; $bBlur = $rgbBlur & 0xff; // When the masked pixels differ less from the original // than the threshold specifies, they are set to their original value. $rNew = abs($rOrig - $rBlur) >= $threshold ? max(0, min(255, $amount * ($rOrig - $rBlur) + $rOrig)) : $rOrig; $gNew = abs($gOrig - $gBlur) >= $threshold ? max(0, min(255, $amount * ($gOrig - $gBlur) + $gOrig)) : $gOrig; $bNew = abs($bOrig - $bBlur) >= $threshold ? max(0, min(255, $amount * ($bOrig - $bBlur) + $bOrig)) : $bOrig; if ($rOrig != $rNew || $gOrig != $gNew || $bOrig != $bNew) { $pixCol = ImageColorAllocate($img, $rNew, $gNew, $bNew); ImageSetPixel($img, $x, $y, $pixCol); } } } ImageDestroy($imgCanvas); ImageDestroy($imgCanvas2); return true; }
/** * increase or decrease the brightness of an image useing GD library; * @param string $filename to the source file * @param string $direction increase or decrease; * @return nothing; * @access private */ function brightness_gd($filename, $direction) { if (substr(PHP_VERSION, 0, 1) < 5) { return false; } if (!function_exists('imagefilter')) { return false; } if (!$this->gdInfo >= 1 || !$this->checkGdFileType($filename)) { return false; } $srcImage =& $this->getImg($filename); if ($this->hasError()) { return false; } if (strtolower($direction) == 'decrease') { $arg = -6; } else { $arg = 6; } ImageFilter($srcImage, IMG_FILTER_BRIGHTNESS, $arg); $this->createNewImg($srcImage, $filename, $this->qualityLevel); return true; }
function ApplyFilters() { if ($this->fltr && is_array($this->fltr)) { if (!(include_once dirname(__FILE__) . '/phpthumb.filters.php')) { $this->DebugMessage('Error including "' . dirname(__FILE__) . '/phpthumb.filters.php" which is required for applying filters (' . implode(';', $this->fltr) . ')', __FILE__, __LINE__); return false; } $phpthumbFilters = new phpthumb_filters(); $phpthumbFilters->phpThumbObject =& $this; foreach ($this->fltr as $filtercommand) { @(list($command, $parameter) = explode('|', $filtercommand, 2)); $this->DebugMessage('Attempting to process filter command "' . $command . '(' . $parameter . ')"', __FILE__, __LINE__); switch ($command) { case 'brit': // Brightness $phpthumbFilters->Brightness($this->gdimg_output, $parameter); break; case 'cont': // Contrast $phpthumbFilters->Contrast($this->gdimg_output, $parameter); break; case 'ds': // Desaturation $phpthumbFilters->Desaturate($this->gdimg_output, $parameter, ''); break; case 'sat': // Saturation $phpthumbFilters->Saturation($this->gdimg_output, $parameter, ''); break; case 'gray': // Grayscale $phpthumbFilters->Grayscale($this->gdimg_output); break; case 'clr': // Colorize if (phpthumb_functions::gd_version() < 2) { $this->DebugMessage('Skipping Colorize() because gd_version is "' . phpthumb_functions::gd_version() . '"', __FILE__, __LINE__); break; } @(list($amount, $color) = explode('|', $parameter, 2)); $phpthumbFilters->Colorize($this->gdimg_output, $amount, $color); break; case 'sep': // Sepia if (phpthumb_functions::gd_version() < 2) { $this->DebugMessage('Skipping Sepia() because gd_version is "' . phpthumb_functions::gd_version() . '"', __FILE__, __LINE__); break; } @(list($amount, $color) = explode('|', $parameter, 2)); $phpthumbFilters->Sepia($this->gdimg_output, $amount, $color); break; case 'gam': // Gamma correction $phpthumbFilters->Gamma($this->gdimg_output, $parameter); break; case 'neg': // Negative colors $phpthumbFilters->Negative($this->gdimg_output); break; case 'th': // Threshold $phpthumbFilters->Threshold($this->gdimg_output, $parameter); break; case 'rcd': // ReduceColorDepth if (phpthumb_functions::gd_version() < 2) { $this->DebugMessage('Skipping ReduceColorDepth() because gd_version is "' . phpthumb_functions::gd_version() . '"', __FILE__, __LINE__); break; } @(list($colors, $dither) = explode('|', $parameter, 2)); $colors = $colors ? (int) $colors : 256; $dither = strlen($dither) > 0 ? (bool) $dither : true; $phpthumbFilters->ReduceColorDepth($this->gdimg_output, $colors, $dither); break; case 'flip': // Flip $phpthumbFilters->Flip($this->gdimg_output, strpos(strtolower($parameter), 'x') !== false, strpos(strtolower($parameter), 'y') !== false); break; case 'edge': // EdgeDetect $phpthumbFilters->EdgeDetect($this->gdimg_output); break; case 'emb': // Emboss $phpthumbFilters->Emboss($this->gdimg_output); break; case 'bvl': // Bevel @(list($width, $color1, $color2) = explode('|', $parameter, 3)); $phpthumbFilters->Bevel($this->gdimg_output, $width, $color1, $color2); break; case 'lvl': // autoLevels @(list($band, $method, $threshold) = explode('|', $parameter, 3)); $band = $band ? preg_replace('#[^RGBA\\*]#', '', strtoupper($band)) : '*'; $method = strlen($method) > 0 ? intval($method) : 2; $threshold = strlen($threshold) > 0 ? floatval($threshold) : 0.1; $phpthumbFilters->HistogramStretch($this->gdimg_output, $band, $method, $threshold); break; case 'wb': // WhiteBalance $phpthumbFilters->WhiteBalance($this->gdimg_output, $parameter); break; case 'hist': // Histogram overlay if (phpthumb_functions::gd_version() < 2) { $this->DebugMessage('Skipping HistogramOverlay() because gd_version is "' . phpthumb_functions::gd_version() . '"', __FILE__, __LINE__); break; } @(list($bands, $colors, $width, $height, $alignment, $opacity, $margin_x, $margin_y) = explode('|', $parameter, 8)); $bands = $bands ? $bands : '*'; $colors = $colors ? $colors : ''; $width = $width ? $width : 0.25; $height = $height ? $height : 0.25; $alignment = $alignment ? $alignment : 'BR'; $opacity = $opacity ? $opacity : 50; $margin_x = $margin_x ? $margin_x : 5; $margin_y = $margin_y; // just to note it wasn't forgotten, but let the value always pass unchanged $phpthumbFilters->HistogramOverlay($this->gdimg_output, $bands, $colors, $width, $height, $alignment, $opacity, $margin_x, $margin_y); break; case 'fram': // Frame @(list($frame_width, $edge_width, $color_frame, $color1, $color2) = explode('|', $parameter, 5)); $phpthumbFilters->Frame($this->gdimg_output, $frame_width, $edge_width, $color_frame, $color1, $color2); break; case 'drop': // DropShadow if (phpthumb_functions::gd_version() < 2) { $this->DebugMessage('Skipping DropShadow() because gd_version is "' . phpthumb_functions::gd_version() . '"', __FILE__, __LINE__); return false; } $this->is_alpha = true; @(list($distance, $width, $color, $angle, $fade) = explode('|', $parameter, 5)); $phpthumbFilters->DropShadow($this->gdimg_output, $distance, $width, $color, $angle, $fade); break; case 'mask': // Mask cropping if (phpthumb_functions::gd_version() < 2) { $this->DebugMessage('Skipping Mask() because gd_version is "' . phpthumb_functions::gd_version() . '"', __FILE__, __LINE__); return false; } @(list($mask_filename, $invert) = explode('|', $parameter, 2)); $mask_filename = $this->ResolveFilenameToAbsolute($mask_filename); if (@is_readable($mask_filename) && ($fp_mask = @fopen($mask_filename, 'rb'))) { $MaskImageData = ''; do { $buffer = fread($fp_mask, 8192); $MaskImageData .= $buffer; } while (strlen($buffer) > 0); fclose($fp_mask); if ($gdimg_mask = $this->ImageCreateFromStringReplacement($MaskImageData)) { if ($invert && phpthumb_functions::version_compare_replacement(phpversion(), '5.0.0', '>=') && phpthumb_functions::gd_is_bundled()) { ImageFilter($gdimg_mask, IMG_FILTER_NEGATE); } $this->is_alpha = true; $phpthumbFilters->ApplyMask($gdimg_mask, $this->gdimg_output); ImageDestroy($gdimg_mask); } else { $this->DebugMessage('ImageCreateFromStringReplacement() failed for "' . $mask_filename . '"', __FILE__, __LINE__); } } else { $this->DebugMessage('Cannot open mask file "' . $mask_filename . '"', __FILE__, __LINE__); } break; case 'elip': // Elipse cropping if (phpthumb_functions::gd_version() < 2) { $this->DebugMessage('Skipping Elipse() because gd_version is "' . phpthumb_functions::gd_version() . '"', __FILE__, __LINE__); return false; } $this->is_alpha = true; $phpthumbFilters->Elipse($this->gdimg_output); break; case 'ric': // RoundedImageCorners if (phpthumb_functions::gd_version() < 2) { $this->DebugMessage('Skipping RoundedImageCorners() because gd_version is "' . phpthumb_functions::gd_version() . '"', __FILE__, __LINE__); return false; } @(list($radius_x, $radius_y) = explode('|', $parameter, 2)); if ($radius_x < 1 || $radius_y < 1) { $this->DebugMessage('Skipping RoundedImageCorners(' . $radius_x . ', ' . $radius_y . ') because x/y radius is less than 1', __FILE__, __LINE__); break; } $this->is_alpha = true; $phpthumbFilters->RoundedImageCorners($this->gdimg_output, $radius_x, $radius_y); break; case 'crop': // Crop @(list($left, $right, $top, $bottom) = explode('|', $parameter, 4)); $phpthumbFilters->Crop($this->gdimg_output, $left, $right, $top, $bottom); break; case 'bord': // Border @(list($border_width, $radius_x, $radius_y, $hexcolor_border) = explode('|', $parameter, 4)); $this->is_alpha = true; $phpthumbFilters->ImageBorder($this->gdimg_output, $border_width, $radius_x, $radius_y, $hexcolor_border); break; case 'over': // Overlay @(list($filename, $underlay, $margin, $opacity) = explode('|', $parameter, 4)); $underlay = (bool) ($underlay ? $underlay : false); $margin = strlen($margin) > 0 ? $margin : ($underlay ? 0.1 : 0.0); $opacity = strlen($opacity) > 0 ? $opacity : 100; if ($margin > 0 && $margin < 1) { $margin = min(0.499, $margin); } elseif ($margin > -1 && $margin < 0) { $margin = max(-0.499, $margin); } $filename = $this->ResolveFilenameToAbsolute($filename); if (@is_readable($filename) && ($fp_watermark = @fopen($filename, 'rb'))) { $WatermarkImageData = ''; do { $buffer = fread($fp_watermark, 8192); $WatermarkImageData .= $buffer; } while (strlen($buffer) > 0); fclose($fp_watermark); if ($img_watermark = $this->ImageCreateFromStringReplacement($WatermarkImageData)) { if ($margin < 1) { $resized_x = max(1, ImageSX($this->gdimg_output) - round(2 * (ImageSX($this->gdimg_output) * $margin))); $resized_y = max(1, ImageSY($this->gdimg_output) - round(2 * (ImageSY($this->gdimg_output) * $margin))); } else { $resized_x = max(1, ImageSX($this->gdimg_output) - round(2 * $margin)); $resized_y = max(1, ImageSY($this->gdimg_output) - round(2 * $margin)); } if ($underlay) { if ($img_watermark_resized = phpthumb_functions::ImageCreateFunction(ImageSX($this->gdimg_output), ImageSY($this->gdimg_output))) { ImageAlphaBlending($img_watermark_resized, false); ImageSaveAlpha($img_watermark_resized, true); $this->ImageResizeFunction($img_watermark_resized, $img_watermark, 0, 0, 0, 0, ImageSX($img_watermark_resized), ImageSY($img_watermark_resized), ImageSX($img_watermark), ImageSY($img_watermark)); if ($img_source_resized = phpthumb_functions::ImageCreateFunction($resized_x, $resized_y)) { ImageAlphaBlending($img_source_resized, false); ImageSaveAlpha($img_source_resized, true); $this->ImageResizeFunction($img_source_resized, $this->gdimg_output, 0, 0, 0, 0, ImageSX($img_source_resized), ImageSY($img_source_resized), ImageSX($this->gdimg_output), ImageSY($this->gdimg_output)); $phpthumbFilters->WatermarkOverlay($img_watermark_resized, $img_source_resized, 'C', $opacity, $margin); ImageCopy($this->gdimg_output, $img_watermark_resized, 0, 0, 0, 0, ImageSX($this->gdimg_output), ImageSY($this->gdimg_output)); } else { $this->DebugMessage('phpthumb_functions::ImageCreateFunction(' . $resized_x . ', ' . $resized_y . ')', __FILE__, __LINE__); } ImageDestroy($img_watermark_resized); } else { $this->DebugMessage('phpthumb_functions::ImageCreateFunction(' . ImageSX($this->gdimg_output) . ', ' . ImageSY($this->gdimg_output) . ')', __FILE__, __LINE__); } } else { // overlay if ($img_watermark_resized = phpthumb_functions::ImageCreateFunction($resized_x, $resized_y)) { ImageAlphaBlending($img_watermark_resized, false); ImageSaveAlpha($img_watermark_resized, true); $this->ImageResizeFunction($img_watermark_resized, $img_watermark, 0, 0, 0, 0, ImageSX($img_watermark_resized), ImageSY($img_watermark_resized), ImageSX($img_watermark), ImageSY($img_watermark)); $phpthumbFilters->WatermarkOverlay($this->gdimg_output, $img_watermark_resized, 'C', $opacity, $margin); ImageDestroy($img_watermark_resized); } else { $this->DebugMessage('phpthumb_functions::ImageCreateFunction(' . $resized_x . ', ' . $resized_y . ')', __FILE__, __LINE__); } } ImageDestroy($img_watermark); } else { $this->DebugMessage('ImageCreateFromStringReplacement() failed for "' . $filename . '"', __FILE__, __LINE__); } } else { $this->DebugMessage('Cannot open overlay file "' . $filename . '"', __FILE__, __LINE__); } break; case 'wmi': // WaterMarkImage @(list($filename, $alignment, $opacity, $margin['x'], $margin['y'], $rotate_angle) = explode('|', $parameter, 6)); // $margin can be pixel margin or percent margin if $alignment is text, or max width/height if $alignment is position like "50x75" $alignment = $alignment ? $alignment : 'BR'; $opacity = strlen($opacity) ? intval($opacity) : 50; $rotate_angle = strlen($rotate_angle) ? intval($rotate_angle) : 0; if (!preg_match('#^([0-9\\.\\-]*)x([0-9\\.\\-]*)$#i', $alignment, $matches)) { $margins = array('x', 'y'); foreach ($margins as $xy) { $margin[$xy] = strlen($margin[$xy]) ? $margin[$xy] : 5; if ($margin[$xy] > 0 && $margin[$xy] < 1) { $margin[$xy] = min(0.499, $margin[$xy]); } elseif ($margin[$xy] > -1 && $margin[$xy] < 0) { $margin[$xy] = max(-0.499, $margin[$xy]); } } } $filename = $this->ResolveFilenameToAbsolute($filename); if (@is_readable($filename)) { if ($img_watermark = $this->ImageCreateFromFilename($filename)) { if ($rotate_angle !== 0) { $phpthumbFilters->ImprovedImageRotate($img_watermark, $rotate_angle, 'FFFFFF', null, $this); } if (preg_match('#^([0-9\\.\\-]*)x([0-9\\.\\-]*)$#i', $alignment, $matches)) { $watermark_max_width = intval($margin['x'] ? $margin['x'] : ImageSX($img_watermark)); $watermark_max_height = intval($margin['y'] ? $margin['y'] : ImageSY($img_watermark)); $scale = phpthumb_functions::ScaleToFitInBox(ImageSX($img_watermark), ImageSY($img_watermark), $watermark_max_width, $watermark_max_height, true, true); $this->DebugMessage('Scaling watermark by a factor of ' . number_format($scale, 4), __FILE__, __LINE__); if ($scale > 1 || $scale < 1) { if ($img_watermark2 = phpthumb_functions::ImageCreateFunction($scale * ImageSX($img_watermark), $scale * ImageSY($img_watermark))) { ImageAlphaBlending($img_watermark2, false); ImageSaveAlpha($img_watermark2, true); $this->ImageResizeFunction($img_watermark2, $img_watermark, 0, 0, 0, 0, ImageSX($img_watermark2), ImageSY($img_watermark2), ImageSX($img_watermark), ImageSY($img_watermark)); $img_watermark = $img_watermark2; } else { $this->DebugMessage('ImageCreateFunction(' . $scale * ImageSX($img_watermark) . ', ' . $scale * ImageSX($img_watermark) . ') failed', __FILE__, __LINE__); } } $watermark_dest_x = round($matches[1] - ImageSX($img_watermark) / 2); $watermark_dest_y = round($matches[2] - ImageSY($img_watermark) / 2); $alignment = $watermark_dest_x . 'x' . $watermark_dest_y; } $phpthumbFilters->WatermarkOverlay($this->gdimg_output, $img_watermark, $alignment, $opacity, $margin['x'], $margin['y']); ImageDestroy($img_watermark); if (isset($img_watermark2) && is_resource($img_watermark2)) { ImageDestroy($img_watermark2); } } else { $this->DebugMessage('ImageCreateFromFilename() failed for "' . $filename . '"', __FILE__, __LINE__); } } else { $this->DebugMessage('!is_readable(' . $filename . ')', __FILE__, __LINE__); } break; case 'wmt': // WaterMarkText @(list($text, $size, $alignment, $hex_color, $ttffont, $opacity, $margin, $angle, $bg_color, $bg_opacity, $fillextend) = explode('|', $parameter, 11)); $text = $text ? $text : ''; $size = $size ? $size : 3; $alignment = $alignment ? $alignment : 'BR'; $hex_color = $hex_color ? $hex_color : '000000'; $ttffont = $ttffont ? $ttffont : ''; $opacity = strlen($opacity) ? $opacity : 50; $margin = strlen($margin) ? $margin : 5; $angle = strlen($angle) ? $angle : 0; $bg_color = $bg_color ? $bg_color : false; $bg_opacity = $bg_opacity ? $bg_opacity : 0; $fillextend = $fillextend ? $fillextend : ''; if (basename($ttffont) == $ttffont) { $ttffont = $this->realPathSafe($this->config_ttf_directory . DIRECTORY_SEPARATOR . $ttffont); } else { $ttffont = $this->ResolveFilenameToAbsolute($ttffont); } $phpthumbFilters->WatermarkText($this->gdimg_output, $text, $size, $alignment, $hex_color, $ttffont, $opacity, $margin, $angle, $bg_color, $bg_opacity, $fillextend); break; case 'blur': // Blur @(list($radius) = explode('|', $parameter, 1)); $radius = $radius ? $radius : 1; if (phpthumb_functions::gd_version() >= 2) { $phpthumbFilters->Blur($this->gdimg_output, $radius); } else { $this->DebugMessage('Skipping Blur() because gd_version is "' . phpthumb_functions::gd_version() . '"', __FILE__, __LINE__); } break; case 'gblr': // Gaussian Blur $phpthumbFilters->BlurGaussian($this->gdimg_output); break; case 'sblr': // Selective Blur $phpthumbFilters->BlurSelective($this->gdimg_output); break; case 'mean': // MeanRemoval blur $phpthumbFilters->MeanRemoval($this->gdimg_output); break; case 'smth': // Smooth blur $phpthumbFilters->Smooth($this->gdimg_output, $parameter); break; case 'usm': // UnSharpMask sharpening @(list($amount, $radius, $threshold) = explode('|', $parameter, 3)); $amount = $amount ? $amount : 80; $radius = $radius ? $radius : 0.5; $threshold = strlen($threshold) ? $threshold : 3; if (phpthumb_functions::gd_version() >= 2.0) { ob_start(); if (!@(include_once dirname(__FILE__) . '/phpthumb.unsharp.php')) { $include_error = ob_get_contents(); if ($include_error) { $this->DebugMessage('include_once("' . dirname(__FILE__) . '/phpthumb.unsharp.php") generated message: "' . $include_error . '"', __FILE__, __LINE__); } $this->DebugMessage('Error including "' . dirname(__FILE__) . '/phpthumb.unsharp.php" which is required for unsharp masking', __FILE__, __LINE__); ob_end_clean(); return false; } ob_end_clean(); phpUnsharpMask::applyUnsharpMask($this->gdimg_output, $amount, $radius, $threshold); } else { $this->DebugMessage('Skipping unsharp mask because gd_version is "' . phpthumb_functions::gd_version() . '"', __FILE__, __LINE__); return false; } break; case 'size': // Resize @(list($newwidth, $newheight, $stretch) = explode('|', $parameter)); $newwidth = !$newwidth ? ImageSX($this->gdimg_output) : ($newwidth > 0 && $newwidth < 1 ? round($newwidth * ImageSX($this->gdimg_output)) : round($newwidth)); $newheight = !$newheight ? ImageSY($this->gdimg_output) : ($newheight > 0 && $newheight < 1 ? round($newheight * ImageSY($this->gdimg_output)) : round($newheight)); $stretch = $stretch ? true : false; if ($stretch) { $scale_x = phpthumb_functions::ScaleToFitInBox(ImageSX($this->gdimg_output), ImageSX($this->gdimg_output), $newwidth, $newwidth, true, true); $scale_y = phpthumb_functions::ScaleToFitInBox(ImageSY($this->gdimg_output), ImageSY($this->gdimg_output), $newheight, $newheight, true, true); } else { $scale_x = phpthumb_functions::ScaleToFitInBox(ImageSX($this->gdimg_output), ImageSY($this->gdimg_output), $newwidth, $newheight, true, true); $scale_y = $scale_x; } $this->DebugMessage('Scaling watermark (' . ($stretch ? 'with' : 'without') . ' stretch) by a factor of "' . number_format($scale_x, 4) . ' x ' . number_format($scale_y, 4) . '"', __FILE__, __LINE__); if ($scale_x > 1 || $scale_x < 1 || $scale_y > 1 || $scale_y < 1) { if ($img_temp = phpthumb_functions::ImageCreateFunction(ImageSX($this->gdimg_output), ImageSY($this->gdimg_output))) { ImageCopy($img_temp, $this->gdimg_output, 0, 0, 0, 0, ImageSX($this->gdimg_output), ImageSY($this->gdimg_output)); //ImageDestroy($this->gdimg_output); if ($this->gdimg_output = phpthumb_functions::ImageCreateFunction($scale_x * ImageSX($img_temp), $scale_y * ImageSY($img_temp))) { ImageAlphaBlending($this->gdimg_output, false); ImageSaveAlpha($this->gdimg_output, true); $this->ImageResizeFunction($this->gdimg_output, $img_temp, 0, 0, 0, 0, ImageSX($this->gdimg_output), ImageSY($this->gdimg_output), ImageSX($img_temp), ImageSY($img_temp)); } else { $this->DebugMessage('ImageCreateFunction(' . $scale_x * ImageSX($img_temp) . ', ' . $scale_y * ImageSY($img_temp) . ') failed', __FILE__, __LINE__); } ImageDestroy($img_temp); } else { $this->DebugMessage('ImageCreateFunction(' . ImageSX($this->gdimg_output) . ', ' . ImageSY($this->gdimg_output) . ') failed', __FILE__, __LINE__); } } break; case 'rot': // ROTate @(list($angle, $bgcolor) = explode('|', $parameter, 2)); $phpthumbFilters->ImprovedImageRotate($this->gdimg_output, $angle, $bgcolor, null, $this); break; case 'stc': // Source Transparent Color @(list($hexcolor, $min_limit, $max_limit) = explode('|', $parameter, 3)); if (!phpthumb_functions::IsHexColor($hexcolor)) { $this->DebugMessage('Skipping SourceTransparentColor hex color is invalid (' . $hexcolor . ')', __FILE__, __LINE__); return false; } $min_limit = strlen($min_limit) ? $min_limit : 5; $max_limit = strlen($max_limit) ? $max_limit : 10; if ($gdimg_mask = $phpthumbFilters->SourceTransparentColorMask($this->gdimg_output, $hexcolor, $min_limit, $max_limit)) { $this->is_alpha = true; $phpthumbFilters->ApplyMask($gdimg_mask, $this->gdimg_output); ImageDestroy($gdimg_mask); } else { $this->DebugMessage('SourceTransparentColorMask() failed for "' . $mask_filename . '"', __FILE__, __LINE__); } break; } $this->DebugMessage('Finished processing filter command "' . $command . '(' . $parameter . ')"', __FILE__, __LINE__); } } return true; }
function Negate_Image() { if (!ImageFilter($this->image, IMG_FILTER_NEGATE)) { return False; } else { return True; } }