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