500)
$amount = 500;
$amount = $amount * 0.016;
if ($radius > 50)
$radius = 50;
$radius = $radius * 2;
if ($threshold > 255)
$threshold = 255;
$radius = abs(round($radius)); // Only integers make sense.
if ($radius == 0) {
return $img;
imagedestroy($img);
//break;
}
$w = imagesx($img);
$h = imagesy($img);
$imgCanvas = $img;
$imgCanvas2 = $img;
$imgBlur = 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
}
$imgCanvas = $imgBlur;
// 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);
}
}
}
return $img;
}
/* }}} */
}
$_CONFIG['types'] = array('', '.gif', '.jpg', '.png');
### check parameters/*{{{*/
if (empty($params['cache'])) {
$_CONFIG['cache'] = Config::Get('PATH_STATIC_CONTENT').'thumbs';
} else {
$_CONFIG['cache'] = $params['cache'];
}
if ((substr($_CONFIG['cache'], -1)) != '/')
$_CONFIG['cache'] .= "/";
if (empty($params['cacheUrl'])) {
$_CONFIG['cacheUrl'] = Config::Get('URL_STATIC_CONTENT').'/thumbs';
} else {
$_CONFIG['cacheUrl'] = $params['cacheUrl'];
}
if (empty($params['file'])) {
//$smarty->("thumb: parameter 'file' cannot be empty");
return;
}
if (!file_exists($params['file'])) {
//$smarty->_trigger_fatal_error("thumb: image file does not exist");
return;
}
if (empty($params['getcachefilename']))
$params['getcachefilename'] = false;
if (empty($params['link']))
$params['link'] = true;
if (empty($params['window']))
$params['window'] = true;
if (empty($params['hint']))
$params['hint'] = true;
if (empty($params['extrapolate']))
$params['extrapolate'] = true;
if (empty($params['dev']))
$params['crop'] = false;
if (empty($params['crop']))
$params['crop'] = true;
if (empty($params['title']))
$params['title'] = '';
if (empty($params['alt']))
$params['alt'] = '';
if (empty($params['width']) AND empty($params['height'])
AND empty($params['longside']) AND empty($params['shortside']))
$params['width'] = 100;
if (empty($params['overlay_position']))
$params['overlay_position'] = 9;
/* }}} */
### get info about the source image (SRC)
$temp = getimagesize($params['file']);
$_SRC['file'] = $params['file'];
$_SRC['width'] = $temp[0];
$_SRC['height'] = $temp[1];
$_SRC['type'] = $temp[2]; // 1=GIF, 2=JPG, 3=PNG, SWF=4
$_SRC['string'] = $temp[3];
$_SRC['filename'] = basename($params['file']);
$_SRC['modified'] = filemtime($params['file']);
// generate hash value
$_SRC['hash'] = md5($_SRC['file'] . $_SRC['modified'] . implode('', $params));
### calculate informations for destination (DST)/*{{{*/
if (isset($params['width']) && is_numeric($params['width']))
$_DST['width'] = $params['width'];
else {
if (empty($params['height']))
$params['height'] = 100;
$_DST['width'] = round($params['height'] / ($_SRC['height'] / $_SRC['width']));
}
if (isset($params['height']) && is_numeric($params['height']))
$_DST['height'] = $params['height'];
else {
if (empty($params['width']))
$params['width'] = 100;
$_DST['height'] = round($params['width'] / ($_SRC['width'] / $_SRC['height']));
}
// Das Gr��enverh�ltnis soll erhalten bleiben egal ob das Bild hoch oder querformatig ist.
if (is_numeric($params['longside'])) {
if ($_SRC['width'] < $_SRC['height']) {
$_DST['height'] = $params['longside'];
$_DST['width'] = round($params['longside'] / ($_SRC['height'] / $_SRC['width']));
} else {
$_DST['width'] = $params['longside'];
$_DST['height'] = round($params['longside'] / ($_SRC['width'] / $_SRC['height']));
}
} elseif (is_numeric($params['shortside'])) {
if ($_SRC['width'] < $_SRC['height']) {
$_DST['width'] = $params['shortside'];
$_DST['height'] = round($params['shortside'] / ($_SRC['width'] / $_SRC['height']));
} else {
$_DST['height'] = $params['shortside'];
$_DST['width'] = round($params['shortside'] / ($_SRC['height'] / $_SRC['width']));
}
}/* }}} */
// check for crop option (default)/*{{{*/
if ($params['crop']) {
$width_ratio = $_SRC['width'] / $_DST['width'];
$height_ratio = $_SRC['height'] / $_DST['height'];
// crop at width
if ($width_ratio > $height_ratio) {
$_DST['offset_w'] = round(($_SRC['width'] - $_DST['width'] * $height_ratio) / 2);
$_SRC['width'] = round($_DST['width'] * $height_ratio);
}
// crop at height
elseif ($width_ratio < $height_ratio) {
$_DST['offset_h'] = round(($_SRC['height'] - $_DST['height'] * $width_ratio) / 2);
$_SRC['height'] = round($_DST['height'] * $width_ratio);
}
}/* }}} */
// Wenn das Ursprungsbild kleiner als das Ziel-Bild ist,
// soll nicht hochskaliert werden und die neu berechneten Werte werden wieder �berschrieben
if ($params['extrapolate'] == 'false' && $_DST['height'] > $_SRC['height'] && $_DST['width'] > $_SRC['width']) {
$_DST['width'] = $_SRC['width'];
$_DST['height'] = $_SRC['height'];
}
if (!empty($params['type']))
$_DST['type'] = $params['type'];
else
$_DST['type'] = $_SRC['type'];
// Output filename for caching
// eliminate the dots in the original filename
$tmp_filename = str_replace(".", "_", $_SRC['filename']);
$_DST['file'] = $_CONFIG['cache'] . $tmp_filename . "_" . $_SRC['hash'] . $_CONFIG['types'][$_DST['type']];
$_DST['fileUrl'] = $_CONFIG['cacheUrl'] .'/'. $tmp_filename . "_" . $_SRC['hash'] . $_CONFIG['types'][$_DST['type']];
$_DST['string'] = 'width="' . $_DST['width'] . '" height="' . $_DST['height'] . '"';
// is a legend available?/*{{{*/
if (!empty($params['legend'])) {
//text_legend_height depends on the later used font!
$text_legend_height = 15;
$_DST['string'] = 'width="' . ($_DST['width']) . '" height="' . ($_DST['height'] + $text_legend_height) . '"';
} else {
//this must be set to 0, so that the frame size can be set correct
$text_legend_height = 0;
}/* }}} */
// is a frame available?/*{{{*/
if (!empty($params['frame'])) {
// check if valid
$imagesize = getimagesize($params['frame']);
if ($imagesize[0] != $imagesize[1] OR $imagesize[0] % 3 OR ! file_exists($params['frame'])) {
//$smarty->_trigger_fatal_error("thumb: wrong dimensions of 'frame'-image or width and height is not a multiplier of 3");
return;
}
// Blockgr��e brauche ich schon hier, falls ein gecachtes Bild wiedergegeben werden soll
$frame_blocksize = $imagesize[0] / 3;
$_DST['string'] = 'width="' . ($_DST['width'] + 2 * $frame_blocksize) . '" height="' . ($_DST['height'] + 2 * $frame_blocksize + $text_legend_height) . '"';
}/* }}} */
### generate return string/*{{{*/
if (empty($params['html']))
$_RETURN['img'] = '
';
// $_RETURN['img'] = '
';
else
$_RETURN['img'] = '
';
if ($params['link'] == "true") {
if (empty($params['linkurl']))
$params['linkurl'] = $_SRC['file'];
if ($params['window'] == "true")
$returner = '' . $_RETURN['img'] . '';
else
$returner = '' . $_RETURN['img'] . '';
} else {
$returner = $_RETURN['img'];
}/* }}} */
############################
### check for cache file ###
############################
if (file_exists($_DST['file']) OR ( isset($params['dev']) && !$params['dev'])) {
if (!$params['getcachefilename']) {
//return normal html image string
return $returner;
} else {
//return cachefilename only
return $_DST['file'];
}
}
############################
### otherwise proceed ###
############################
// read SRC/*{{{*/
if ($_SRC['type'] == 1) {
$_SRC['image'] = @imagecreatefromgif($_SRC['file']);
$_SRC['gif_colorstotal'] = @imagecolorstotal($_SRC['image']);
$_SRC['gif_transparent_index'] = @imagecolortransparent($_SRC['image']);
//we have a transparent color
if (($_SRC['gif_transparent_index'] >= 0) && ($_SRC['gif_transparent_index'] < $_SRC['gif_colorstotal'])) {
//get the actual transparent color
$gif_rgb = imagecolorsforindex($_SRC['image'], $_SRC['gif_transparent_index']);
$_SRC['gif_original_transparency_rgb'] = ($gif_rgb['red'] << 16) | ($gif_rgb['green'] << 8) | $gif_rgb['blue'];
//change the transparent color to black, since transparent goes to black anyways (no way to remove transparency in GIF)
imagecolortransparent($_SRC['image'], imagecolorallocate($_SRC['image'], 0, 0, 0));
}
}
if ($_SRC['type'] == 2)
$_SRC['image'] = imagecreatefromjpeg($_SRC['file']);
if ($_SRC['type'] == 3)
$_SRC['image'] = imagecreatefrompng($_SRC['file']);
/* }}} */
// if the image is very) large, scale linear to 4x $_DST size and overwrite the source $_SRC/*{{{*/
if ($_DST['width'] * 4 < $_SRC['width'] AND $_DST['height'] * 4 < $_SRC['height']) {
// Multiplikator der Zielgr��e
$_TMP['width'] = round($_DST['width'] * 4);
$_TMP['height'] = round($_DST['height'] * 4);
$_TMP['image'] = imagecreatetruecolor($_TMP['width'], $_TMP['height']);
if (!isset($_DST['offset_w'])) {
$_DST['offset_w'] = 0;
}
if (!isset($_DST['offset_h'])) {
$_DST['offset_h'] = 0;
}
imagecopyresized($_TMP['image'], $_SRC['image'], 0, 0, $_DST['offset_w'], $_DST['offset_h'], $_TMP['width'], $_TMP['height'], $_SRC['width'], $_SRC['height']);
$_SRC['image'] = $_TMP['image'];
$_SRC['width'] = $_TMP['width'];
$_SRC['height'] = $_TMP['height'];
// Wenn vorskaliert wird, darf ja nicht nochmal ein bestimmter Bereich ausgeschnitten werden
$_DST['offset_w'] = 0;
$_DST['offset_h'] = 0;
unset($_TMP['image']);
}/* }}} */
// DST erstellen
$_DST['image'] = imagecreatetruecolor($_DST['width'], $_DST['height']);
if (!isset($_DST['offset_w'])) {
$_DST['offset_w'] = 0;
}
if (!isset($_DST['offset_h'])) {
$_DST['offset_h'] = 0;
}
if ($_SRC['image']) {
if (($_SRC['type'] == 1) && ($_SRC['gif_transparent_index'] >= 0)) {
//only for transparent gif:
imagealphablending($_SRC['image'], false);
imagesavealpha($_SRC['image'], true);
imagecopyresized($_DST['image'], $_SRC['image'], 0, 0, $_DST['offset_w'], $_DST['offset_h'], $_DST['width'], $_DST['height'], $_SRC['width'], $_SRC['height']);
} else {
imagecopyresampled($_DST['image'], $_SRC['image'], 0, 0, $_DST['offset_w'], $_DST['offset_h'], $_DST['width'], $_DST['height'], $_SRC['width'], $_SRC['height']);
}
if (isset($params['sharpen']) && ($params['sharpen'] != "false"))
$_DST['image'] = UnsharpMask($_DST['image'], 80, .5, 3);
}
// add a magnifier/*{{{*/
if (($params['link'] == "true") && ($params['hint'] == "true")) {
// sure to add a white bar?
if ($params['addgreytohint'] != 'false') {
$trans = imagecolorallocatealpha($_DST['image'], 255, 255, 255, 25);
imagefilledrectangle($_DST['image'], 0, $_DST['height'] - 9, $_DST['width'], $_DST['height'], $trans);
}
$magnifier = imagecreatefromstring(gzuncompress(base64_decode("eJzrDPBz5+WS4mJgYOD19HAJAtLcIMzBBiRXrilXA1IsxU6eIRxAUMOR0gHkcxZ4RBYD1QiBMOOlu3V/gIISJa4RJc5FqYklmfl5CiGZuakMBoZ6hkZ6RgYGJs77ex2BalRBaoLz00rKE4tSGXwTk4vyc1NTMhMV3DKLUsvzi7KLFXwjFEAa2svWnGdgYPTydHEMqZhTOsE++1CAyNHzm2NZjgau+dAmXlAwoatQmOld3t/NPxlLMvY7sovPzXHf7re05BPzjpQTMkZTPjm1HlHkv6clYWK43Zt16rcDjdZ/3j2cd7qD4/HHH3GaprFrw0QZDHicORXl2JsPsveVTDz//L3N+WpxJ5Hff+10Tjdd2/Vi17vea79Om5w9zzyne9GLnWGrN8atby/ayXPOsu2w4quvVtxNCVVz5nAf3nDpZckBCedpqSc28WTOWnT7rZNXZSlPvFybie9EFc6y3bIMCn3JAoJ+kyyfn9qWq+LZ9Las26Jv482cDRE6Ci0B6gVbo2oj9KabzD8vyMK4ZMqMs2kSvW4chz88SXNzmeGjtj1QZK9M3HHL8L7HITX3t19//VVY8CYDg9Kvy2vDXu+6mGGxNOiltMPsjn/t9eJr0ja/FOdi5TyQ9Lz3fOqstOr99/dnro2vZ1jy76D/vYivPsBoYPB09XNZ55TQBAAJjs5s