一个强大的图片缩放类,支持填充缩放模式
我们在截图的时候,如果给定的尺寸比例与原图比例不等,那么情况就是缩略出来的图片总有一边是不理想的, 可能高度不够,也可能宽度不够,最近项目用到图片缩放,发现了这个问题,于是重写了框架里的图片缩放方法,大家可能都知道电脑设置壁纸模式的时候有一项为“填充”,这种模式保证了你的屏幕不会出现空白,图片会自动调整到填满屏幕大小,那么下面这个方法加入了这一种模式,保证你需要的尺寸一定会有图,而不是出现黑边或者尺寸不理想等情况。
启用填充模式需要设置:$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 ; } |