. 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', 'backgroundColor' => null, //must be hex color ); //set the $this->params array if (is_array($params)) { foreach ($params as $key => $value) { $defaultParams[$key] = $value; } } $this->params = $defaultParams; } public function getSourceCoordinates($direction, $oldDim, $dim) { if ($direction === "x") { switch ($this->params['horizAlign']) { case 'left': $coordSrc = 0; break; case 'right': $coordSrc = floor(($oldDim-$dim)); break; case 'center': $coordSrc = floor(($oldDim-$dim)/2); break; default: $coordSrc = $this->params['horizAlign']; } } else { switch ($this->params['vertAlign']) { case 'top': $coordSrc = 0; break; case 'bottom': $coordSrc = floor(($oldDim-$dim)); break; case 'center': $coordSrc = floor(($oldDim-$dim)/2); break; default: $coordSrc = $this->params['vertAlign']; } } return $coordSrc; } //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); } $xSrc = 0; //x coordinate of source image $ySrc = 0; //y coordinate of source image $xDst = 0; //x coordinate of destination image $yDst = 0; //y coordinate of destination image if ($this->params['cropImage'] === 'no') { if ($scale <= 1) { $newWidth = $backWidth = floor($scale*$width); $newHeight = $backHeight = floor($scale*$height); if ($this->params['backgroundColor']) { $backWidth = $this->params['imgWidth']; $backHeight = $this->params['imgHeight']; if ($backWidth > $newWidth) { $xDst = floor(($backWidth-$newWidth)/2); } else if ($backHeight > $newHeight) { $yDst = floor(($backHeight-$newHeight)/2); } } } else { $newWidth = $backWidth = $width; $newHeight = $backHeight = $height; if ($this->params['backgroundColor']) { $backWidth = $this->params['imgWidth']; $backHeight = $this->params['imgHeight']; $xDst = floor(($backWidth-$newWidth)/2); $yDst = floor(($backHeight-$newHeight)/2); } } } else if ($this->params['cropImage'] === 'yes') { if ($scale < 1) { $newWidth = $backWidth = $this->params['imgWidth']; $newHeight = $backHeight = $this->params['imgHeight']; $oldWidth = $width; $oldHeight = $height; $width = floor($newWidth/$scale); $height = floor($newHeight/$scale); $xSrc = $this->getSourceCoordinates("x",$oldWidth,$width); $ySrc = $this->getSourceCoordinates("y",$oldHeight,$height); } else { $oldWidth = $width; $oldHeight = $height; if ($width <= $this->params['imgWidth'] and $height <= $this->params['imgHeight']) { $newWidth = $backWidth = $width; $newHeight = $backHeight = $height; if ($this->params['backgroundColor']) { $backWidth = $this->params['imgWidth']; $backHeight = $this->params['imgHeight']; $xDst = floor(($backWidth-$newWidth)/2); $yDst = floor(($backHeight-$newHeight)/2); } } else if ($width <= $this->params['imgWidth']) { $newWidth = $backWidth = $width; $newHeight = $backHeight = $height = $this->params['imgHeight']; $ySrc = $this->getSourceCoordinates("y",$oldHeight,$height); if ($this->params['backgroundColor']) { $backWidth = $this->params['imgWidth']; $backHeight = $this->params['imgHeight']; $xDst = floor(($backWidth-$newWidth)/2); } } else if ($height <= $this->params['imgHeight']) { $newHeight = $backHeight = $height; $newWidth = $backWidth = $width = $this->params['imgWidth']; $xSrc = $this->getSourceCoordinates("x",$oldWidth,$width); if ($this->params['backgroundColor']) { $backWidth = $this->params['imgWidth']; $backHeight = $this->params['imgHeight']; $yDst = floor(($backHeight-$newHeight)/2); } } } } //temp image $tmpImg = imagecreatetruecolor($backWidth, $backHeight); //set background color if backgroundColor param is not null (hex value) if ($this->params['backgroundColor']) { if (strcmp($this->params['backgroundColor'],"transparent") !== 0) { $rgbColor = hex2rgb($this->params['backgroundColor']); $backgroundC = imagecolorallocate($tmpImg,$rgbColor[0],$rgbColor[1],$rgbColor[2]); } else { $backgroundC = imagecolortransparent($tmpImg); } imagefill($tmpImg, 0, 0, $backgroundC); } if(strcmp($type,'png') === 0 or strcmp($type,'gif') === 0){ if ($this->params['backgroundColor']) { imagealphablending($tmpImg, true); } else { imagealphablending($tmpImg, false); } imagesavealpha($tmpImg, true); } if ($this->params['resample'] === 'yes') { //copy and resample imagecopyresampled($tmpImg, $img, $xDst, $yDst, $xSrc, $ySrc,$newWidth, $newHeight, $width, $height); } else { //copy and resize imagecopyresized($tmpImg, $img, $xDst, $yDst, $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); } 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); } } }