.
if (!defined('EG')) die('Direct access not allowed!');
//class to create a thumbnail
class Image_Gd_Thumbnail
{
const DS = DIRECTORY_SEPARATOR;
private $params = array(); //parameters of the object
private $basePath = null; //the path of the folder inside which the images are saved
public function __construct($basePath,$params = null)
{
$finalChar = $basePath[strlen($basePath) - 1];
if (strcmp($finalChar,self::DS) !== 0) $basePath .= self::DS;
$this->basePath = $basePath;
$defaultParams = array(
'imgWidth' => null,
'imgHeight' => null,
'defaultImage' => null,
'cropImage' => 'no',
'horizAlign' => 'left',
'vertAlign' => 'top',
'resample' => 'yes',
'function' => 'none',
'outputFormat' => 'jpeg',
);
//set the $this->scaffold->params array
if (is_array($params))
{
foreach ($params as $key => $value)
{
$defaultParams[$key] = $value;
}
}
$this->params = $defaultParams;
}
//create the thumbnail
//$imageName: the name of the file inside $this->basePath
//$outputFile: the name of the output file
public function render($imageFile, $outputFile = null)
{
$imagePath = $this->basePath . basename($imageFile);
if (!file_exists($imagePath) and isset($this->params['defaultImage'])) $imagePath = $this->params['defaultImage'];
$img = null;
$type = 'jpeg';
$contentType = 'image/jpeg';
if (file_exists($imagePath))
{
$extArray = explode('.', $imagePath);
$ext = strtolower(end($extArray));
if (strcmp($ext,'jpg') === 0 or strcmp($ext,'jpeg') === 0) {
$img = @imagecreatefromjpeg($imagePath);
$type = 'jpeg';
$contentType = 'image/jpeg';
} else if (strcmp($ext,'png') === 0) {
$img = @imagecreatefrompng($imagePath);
$type = 'png';
$contentType = 'image/png';
} else if (strcmp($ext,'gif') === 0) {
$img = @imagecreatefromgif($imagePath);
$type = 'gif';
$contentType = 'image/gif';
}
}
//If an image was successfully loaded, test the image for size
if ($img)
{
//image size
$width = imagesx($img);
$height = imagesy($img);
if (!isset($this->params['imgWidth'])) $this->params['imgWidth'] = $width;
if (!isset($this->params['imgHeight'])) $this->params['imgHeight'] = $height;
if ($this->params['cropImage'] === 'no')
{
$scale = min($this->params['imgWidth']/$width, $this->params['imgHeight']/$height);
}
else if ($this->params['cropImage'] === 'yes')
{
$scale = max($this->params['imgWidth']/$width, $this->params['imgHeight']/$height);
}
if ($scale < 1) {
$xSrc = 0;
$ySrc = 0;
if ($this->params['cropImage'] === 'no')
{
$newWidth = floor($scale*$width);
$newHeight = floor($scale*$height);
}
else if ($this->params['cropImage'] === 'yes')
{
$newWidth = $this->params['imgWidth'];
$newHeight = $this->params['imgHeight'];
$oldWidth = $width;
$oldHeight = $height;
$width = floor($newWidth/$scale);
$height = floor($newHeight/$scale);
switch ($this->params['horizAlign'])
{
case 'left':
$xSrc = 0;
break;
case 'right':
$xSrc = floor(($oldWidth-$width));
break;
case 'center':
$xSrc = floor(($oldWidth-$width)/2);
break;
default:
$xSrc = $this->params['horizAlign'];
}
switch ($this->params['vertAlign'])
{
case 'top':
$ySrc = 0;
break;
case 'bottom':
$ySrc = floor(($oldHeight-$height));
break;
case 'center':
$ySrc = floor(($oldHeight-$height)/2);
break;
default:
$ySrc = $this->params['vertAlign'];
}
}
//temp image
$tmpImg = imagecreatetruecolor($newWidth, $newHeight);
if(strcmp($type,'png') === 0 or strcmp($type,'gif') === 0){
imagealphablending($tmpImg, false);
imagesavealpha($tmpImg, true);
}
if ($this->params['resample'] === 'yes')
{
//copy and resample
imagecopyresampled($tmpImg, $img, 0, 0, $xSrc, $ySrc,$newWidth, $newHeight, $width, $height);
}
else
{
//copy and resize
imagecopyresized($tmpImg, $img, 0, 0, $xSrc, $ySrc,$newWidth, $newHeight, $width, $height);
}
imagedestroy($img);
$img = $tmpImg;
if (!function_exists($this->params['function'])) {
throw new Exception('Error in '.__METHOD__.': function '.$this->params['function']. ' does not exist');
}
$img = call_user_func($this->params['function'],$img);
}
else
{
if(strcmp($type,'png') === 0 or strcmp($type,'gif') === 0){
imagealphablending($img, false);
imagesavealpha($img, true);
}
}
}
if (!$img)
{
$imgWidth = isset($this->params['imgWidth']) ? $this->params['imgWidth'] : 100;
$imgHeight = isset($this->params['imgHeight']) ? $this->params['imgHeight'] : 100;
$img = imagecreate($imgWidth, $imgHeight);
imagecolorallocate($img,200,200,200);
}
//print the image
if (!isset($outputFile))
{
header("Content-type: $contentType");
}
if (strcmp($type,'png') === 0)
{
imagepng($img,$outputFile,9);
}
else if (strcmp($type,'gif') === 0)
{
imagegif($img,$outputFile);
}
else
{
imagejpeg($img,$outputFile,90);
}
}
}