From e2f2b2ae71eae75f5ac47b4e36b360ec153fe9b3 Mon Sep 17 00:00:00 2001 From: Li Jianxuan Date: Fri, 3 Jan 2014 02:22:45 +0000 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E8=A3=81=E5=9B=BE?= =?UTF-8?q?=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- application/module/Files/Thumbnail.php | 363 +++++++++++++++---------- 1 file changed, 217 insertions(+), 146 deletions(-) diff --git a/application/module/Files/Thumbnail.php b/application/module/Files/Thumbnail.php index 6d63fa79..9a98fae7 100644 --- a/application/module/Files/Thumbnail.php +++ b/application/module/Files/Thumbnail.php @@ -9,153 +9,224 @@ namespace Files; */ class Thumbnail { - private $maxWidth; - private $maxHeight; - private $scale; - private $inflate; - private $types; - private $imgLoaders; - private $imgCreators; - private $source; - private $sourceWidth; - private $sourceHeight; - private $sourceMime; - private $thumb; - private $thumbWidth; - private $thumbHeight; - - public function __construct($maxWidth, $maxHeight, $scale = true, $inflate = false) { - $this->maxWidth = $maxWidth; - $this->maxHeight = $maxHeight; - $this->scale = $scale; - $this->inflate = $inflate; - $this->types = array( - 'image/jpeg', - 'image/png', - 'image/gif' - ); - //加载MIME类型图像的函数名称 - $this->imgLoaders = array( - 'image/jpeg' => 'imagecreatefromjpeg', - 'image/png' => 'imagecreatefrompng', - 'image/gif' => 'imagecreatefromgif' - ); - //储存创建MIME类型图片的函数名称 - $this->imgCreators = array( - 'image/jpeg' => 'imagejpeg', - 'image/png' => 'imagepng', - 'image/gif' => 'imagegif' - ); - } - /** - * 文件方式加载图片 - * @param string $image 源图片 - * @return bool - */ - public function loadFile($image){ - if(!$dims = @getimagesize($image)){ - trigger_error("源图片不存在"); - } - if(in_array($dims['mime'], $this->types)){ - $loader = $this->imgLoaders[$dims['mime']]; - $this->source = $loader($image); - if($dims['mime'] == 'image/png' || $dims['mime'] == 'image/gif'){ - imagesavealpha($this->source, true); - } - $this->sourceWidth = $dims[0]; - $this->sourceHeight = $dims[1]; - $this->sourceMime = $dims['mime']; - $this->initThumb(); - return TRUE; - }else{ - trigger_error('不支持'.$dims['mime']."图片类型"); - } - } - /** - * 字符串方式加载图片 - * @param string $image 字符串 - * @param string $mime 图片类型 - * @return type - */ - public function loadData($image,$mime){ - if(in_array($mime, $this->types)){ - if($this->source = @imagecreatefromstring($image)){ - $this->sourceWidth = imagesx($this->source); - $this->sourceHeight = imagesy($this->source); - $this->sourceMime = $mime; - $this->initThumb(); - return TRUE; - }else{ - trigger_error("不能从字符串加载图片"); - } - }else{ - trigger_error("不支持".$mime."图片格式"); - } - } - /** - * 生成缩略图 - * @param string $file 文件名。如果不为空则储存为文件,否则直接输出到浏览器 - */ - public function buildThumb($file = NULL){ - $creator = $this->imgCreators[$this->sourceMime]; - if(isset($file) && $this->thumb !== NULL){ - return $creator($this->thumb,$file); - }else{ - return false; - } - } - /** - * 处理缩放 - */ - public function initThumb(){ - if($this->scale){ - if($this->sourceWidth > $this->sourceHeight){ - $this->thumbWidth = $this->maxWidth; - $this->thumbHeight = floor($this->sourceHeight*($this->maxWidth/$this->sourceWidth)); - }elseif($this->sourceWidth < $this->sourceHeight){ - $this->thumbHeight = $this->maxHeight; - $this->thumbWidth = floor($this->sourceWidth*($this->maxHeight/$this->sourceHeight)); - }else{ - $this->thumbWidth = $this->maxWidth; - $this->thumbHeight = $this->maxHeight; - } - } - - if($this->sourceWidth <= $this->maxWidth && $this->sourceHeight <= $this->maxHeight && $this->inflate == FALSE){ - $this->thumb = NULL; - }else{ - $this->thumb = imagecreatetruecolor($this->thumbWidth, $this->thumbHeight); - if($this->sourceMime == 'image/png' || $this->sourceMime == 'image/gif') - { - - imagealphablending($this->thumb, true); - imagesavealpha($this->thumb, true); - if($this->sourceMime == 'image/gif') - { - $bgcolor=imagecolorallocate($this->thumb,0,0,0); - $transparent = imagecolortransparent($this->thumb,$bgcolor) ; - } - if($this->sourceMime == 'image/png') - { - $transparent = imagecolorallocatealpha($this->thumb, 0, 0, 0, 127); - } - imagefill($this->thumb, 0, 0, $transparent); + private $maxWidth; + private $maxHeight; + private $scale; + private $inflate; + private $types; + private $imgLoaders; + private $imgCreators; + private $source; + private $sourceWidth; + private $sourceHeight; + private $sourceMime; + private $thumb; + private $thumbWidth; + private $thumbHeight; + + public function __construct($maxWidth, $maxHeight, $scale = true, $inflate = false) { + $this->maxWidth = $maxWidth; + $this->maxHeight = $maxHeight; + $this->scale = $scale; + $this->inflate = $inflate; + $this->types = array( + 'image/jpeg', + 'image/png', + 'image/gif' + ); + //加载MIME类型图像的函数名称 + $this->imgLoaders = array( + 'image/jpeg' => 'imagecreatefromjpeg', + 'image/png' => 'imagecreatefrompng', + 'image/gif' => 'imagecreatefromgif' + ); + //储存创建MIME类型图片的函数名称 + $this->imgCreators = array( + 'image/jpeg' => 'imagejpeg', + 'image/png' => 'imagepng', + 'image/gif' => 'imagegif' + ); + } + + /** + * 文件方式加载图片 + * @param string $image 源图片 + * @return bool + */ + public function loadFile($image){ + if(!$dims = @getimagesize($image)){ + trigger_error("源图片不存在"); + } + if(in_array($dims['mime'], $this->types)){ + $loader = $this->imgLoaders[$dims['mime']]; + $this->source = $loader($image); + if($dims['mime'] == 'image/png' || $dims['mime'] == 'image/gif'){ + imagesavealpha($this->source, true); } - imagecopyresampled($this->thumb, $this->source, 0, 0, 0, 0, $this->thumbWidth, $this->thumbHeight, $this->sourceWidth, $this->sourceHeight); - } - } - - public function getMine(){ - return $this->sourceMime; - } - - public function getThumbWidth(){ - return $this->thumbWidth; - } - - public function getThumbHeight(){ - return $this->thumbHeight; - } + $this->sourceWidth = $dims[0]; + $this->sourceHeight = $dims[1]; + $this->sourceMime = $dims['mime']; + $this->initThumb(); + return TRUE; + }else{ + trigger_error('不支持'.$dims['mime']."图片类型"); + } + } + + /** + * 字符串方式加载图片 + * @param string $image 字符串 + * @param string $mime 图片类型 + * @return type + */ + public function loadData($image,$mime){ + if(in_array($mime, $this->types)){ + if($this->source = @imagecreatefromstring($image)){ + $this->sourceWidth = imagesx($this->source); + $this->sourceHeight = imagesy($this->source); + $this->sourceMime = $mime; + $this->initThumb(); + return TRUE; + }else{ + trigger_error("不能从字符串加载图片"); + } + }else{ + trigger_error("不支持".$mime."图片格式"); + } + } + + /** + * 生成缩略图 + * @param string $file 文件名。如果不为空则储存为文件,否则直接输出到浏览器 + */ + public function buildThumb($file = NULL){ + $creator = $this->imgCreators[$this->sourceMime]; + if(isset($file) && $this->thumb !== NULL){ + return $creator($this->thumb,$file); + }else{ + return false; + } + } + + /** + * 处理缩放 + */ + public function initThumb(){ + if($this->scale){ + if($this->sourceWidth > $this->sourceHeight){ + $this->thumbWidth = $this->maxWidth; + $this->thumbHeight = floor($this->sourceHeight*($this->maxWidth/$this->sourceWidth)); + }elseif($this->sourceWidth < $this->sourceHeight){ + $this->thumbHeight = $this->maxHeight; + $this->thumbWidth = floor($this->sourceWidth*($this->maxHeight/$this->sourceHeight)); + }else{ + $this->thumbWidth = $this->maxWidth; + $this->thumbHeight = $this->maxHeight; + } + } + + if($this->sourceWidth <= $this->maxWidth && $this->sourceHeight <= $this->maxHeight && $this->inflate == FALSE){ + $this->thumb = NULL; + }else{ + $this->thumb = imagecreatetruecolor($this->thumbWidth, $this->thumbHeight); + if($this->sourceMime == 'image/png' || $this->sourceMime == 'image/gif') + { + + imagealphablending($this->thumb, true); + imagesavealpha($this->thumb, true); + if($this->sourceMime == 'image/gif') + { + $bgcolor=imagecolorallocate($this->thumb,0,0,0); + $transparent = imagecolortransparent($this->thumb,$bgcolor) ; + } + if($this->sourceMime == 'image/png') + { + $transparent = imagecolorallocatealpha($this->thumb, 0, 0, 0, 127); + } + imagefill($this->thumb, 0, 0, $transparent); + } + imagecopyresampled($this->thumb, $this->source, 0, 0, 0, 0, $this->thumbWidth, $this->thumbHeight, $this->sourceWidth, $this->sourceHeight); + } + } + + public function getMine(){ + return $this->sourceMime; + } + + public function getThumbWidth(){ + return $this->thumbWidth; + } + + public function getThumbHeight(){ + return $this->thumbHeight; + } + + static function cut($source_path, $target_width, $target_height){ + $source_info = getimagesize($source_path); + $source_width = $source_info[0]; + $source_height = $source_info[1]; + $source_mime = $source_info['mime']; + $source_ratio = $source_height / $source_width; + $target_ratio = $target_height / $target_width; + + // 源图过高 + if ($source_ratio > $target_ratio) + { + $cropped_width = $source_width; + $cropped_height = $source_width * $target_ratio; + $source_x = 0; + $source_y = ($source_height - $cropped_height) / 2; + } + // 源图过宽 + elseif ($source_ratio < $target_ratio) + { + $cropped_width = $source_height / $target_ratio; + $cropped_height = $source_height; + $source_x = ($source_width - $cropped_width) / 2; + $source_y = 0; + } + // 源图适中 + else + { + $cropped_width = $source_width; + $cropped_height = $source_height; + $source_x = 0; + $source_y = 0; + } + + switch ($source_mime) + { + case 'image/gif': + $source_image = imagecreatefromgif($source_path); + break; + + case 'image/jpeg': + $source_image = imagecreatefromjpeg($source_path); + break; + + case 'image/png': + $source_image = imagecreatefrompng($source_path); + break; + + default: + return false; + break; + } + + $target_image = imagecreatetruecolor($target_width, $target_height); + $cropped_image = imagecreatetruecolor($cropped_width, $cropped_height); + + // 裁剪 + imagecopy($cropped_image, $source_image, 0, 0, $source_x, $source_y, $cropped_width, $cropped_height); + // 缩放 + imagecopyresampled($target_image, $cropped_image, 0, 0, 0, 0, $target_width, $target_height, $cropped_width, $cropped_height); + + header('Content-Type: image/jpeg'); + imagejpeg($target_image); + imagedestroy($source_image); + imagedestroy($target_image); + imagedestroy($cropped_image); + }//cute }