一个强大的图片缩放类,支持填充缩放模式
我们在截图的时候,如果给定的尺寸比例与原图比例不等,那么情况就是缩略出来的图片总有一边是不理想的, 可能高度不够,也可能宽度不够,最近项目用到图片缩放,发现了这个问题,于是重写了框架里的图片缩放方法,大家可能都知道电脑设置壁纸模式的时候有一项为“填充”,这种模式保证了你的屏幕不会出现空白,图片会自动调整到填满屏幕大小,那么下面这个方法加入了这一种模式,保证你需要的尺寸一定会有图,而不是出现黑边或者尺寸不理想等情况。
启用填充模式需要设置:$scaleMode=false;
以下方法只是框架图片类中的一部分:
/** * 生成缩略图 * @author Joychao<Joy#joychao.cc> * @static * @param string $image 原图 * @param string $type 图像格式 * @param string $maxWidth 目标最大宽度 * @param string $maxHeight 目标最大高度 * @param string $prefix 目标后缀 * @param boolean $scaleMode 按比例切割模式 * @param boolean $saveImg 生成后是否保存文件 * @param boolean $interlace 启用隔行扫描 * @return void */ static function thumbnail($image,$type='',$maxWidth=200,$maxHeight=50,$prefix='_thumb',$scaleMode=false,$saveImg=true,$interlace=true) { // 获取原图信息 $info = self::getInfo($image); if($info !== false) { $srcWidth = $info['width']; $srcHeight = $info['height']; $type = empty($type)?$info['type']:$type; $type = strtolower($type); $interlace = $interlace? 1:0; unset($info); // 载入原图 $createFun = 'Imagecreatefrom'.($type=='jpg'?'jpeg':$type); $srcImg = $createFun($image); if($scaleMode){//按比例切图 $scale = min($maxWidth/$srcWidth, $maxHeight/$srcHeight); // 计算缩放比例 if($scale>=1) { // 超过原图大小不再缩略 $width = $srcWidth; $height = $srcHeight; }else{ // 缩略图尺寸 $width = (int)($srcWidth*$scale); $height = (int)($srcHeight*$scale); } }else{//不按比例切图 $newScale=$maxWidth/$maxHeight; $srcScale=$srcWidth/$srcHeight; if($srcScale>=$newScale){ $height=$maxHeight; $width=intval($height*($srcWidth/$srcHeight)); }else{ $width=$maxWidth; $height=intval($width/($srcWidth/$srcHeight)); } $thumbImgFirst = imagecreatetruecolor($width, $height); imagecopyresampled($thumbImgFirst, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth,$srcHeight); if($srcScale>=$newScale){ //原图起点 $startX=intval(($width-$maxWidth)*0.5); $startY=0; $width=$maxWidth; }else{ //原图起点 $startX=0; $startY=intval(($height-$maxHeight)*0.5); $height=$maxHeight; } } //创建缩略图 if($type!='gif' && function_exists('imagecreatetruecolor')){ $thumbImg = imagecreatetruecolor($width, $height); }else{ $thumbImg = imagecreate($width, $height); } // 复制图片 if(!$scaleMode){ imagecopymerge($thumbImg, $thumbImgFirst, 0, 0, $startX, $startY, $width, $height, 100); }else{ if(function_exists("Imagecopyresampled")){ imagecopyresampled($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth,$srcHeight); }else{ imagecopyresized($thumbImg, $srcImg, 0, 0, 0, 0, $width, $height, $srcWidth,$srcHeight); } } if('gif'==$type || 'png'==$type) { $background_color = imagecolorallocate($thumbImg, 0,255,0); //指派一个绿色 imagecolortransparent($thumbImg,$background_color); //设置为透明色,若注释掉该行则输出绿色的图 } // 对jpeg图形设置隔行扫描 if('jpg'==$type || 'jpeg'==$type) imageinterlace($thumbImg,$interlace); // 生成图片保存 $imageFun = 'image'.($type=='jpg'?'jpeg':$type); $thumbName=preg_replace('/(\.\w+)$/', $prefix.'\\1', $image); //abs_thumb.jpg if($saveImg)//是否需要保存文件 $imageFun($thumbImg,$thumbName); else $imageFun($thumbImg); imagedestroy($thumbImg); imagedestroy($srcImg); return $thumbName; } return false; } /** * 获取图片信息 * @static * @param string $path 图片路径 * @return array */ static function getInfo($path){ $arr=getimagesize($path); $info['width']=$arr[0]; $info['height']=$arr[1]; $info['mime']=$arr['mime']; return $info; } |

浙公网安备 33010602011771号