您的位置:首页 > 编程语言 > PHP开发

PHP创建缩略图的最终方案

2012-04-24 21:36 141 查看
前一篇文章说了一下imagecopyresampled函数创建缩略图模糊的问题

文中提到imagecopyresized函数可以不计较宽度是否为奇偶的情况,但这个函数又有个问题,就是生成的图片不够清晰,或者说是有点锐化的感觉,图片大点的时候还好,要是缩得比较小,像180*180缩为65*65,如果原图的锐化程度稍高,那缩成小图后,基本上也就看不清楚内容了。如下图这种类型。



其实imagecopyresampled生成缩略图的效果真的不错,如果不是因为奇偶关系的话。一般锐度高的,它会变得比较柔和,看着很舒服。

所以用imagecopyresampled是没有错的。那就要解决模糊的问题,其实奇偶问题还是很好解决的,方法:

首页,看看你要生成缩略图大小的宽,是偶数还是奇数,这里用偶数好了

其次,在生成缩略图之前,检测原图的宽,是奇数还是偶数,如果是偶数,不管它,如果是奇数,就将目标宽度+1

最后,按新的宽度生成缩略图

这样子,可能生成的缩略图比预定的缩略图大1px,从显示的角度上讲,基本上是没有什么问题的。切记,在显示的时候,不要为它高死宽高,不然很有可能再次变模糊。

下面是我用来生成头像缩略图的代码,一共要生成3种大小的头像,65px,120px,180px,参数$path为原图的路径

$jo用于判断奇偶

$targ_w = $targ_h =$jo?$sys[$i]+1:$sys[$i]; 就是根据奇偶生成目标大小的宽高。
public function save_avatar($path,$uid){
$jpeg_quality = 90;
$src = $path;
$size=getimagesize($src);
$jo=$size[0]%2==0?0:1;
$sys=Route::load_config('sys');
$avatarinfo=$this->getavatarinfo($uid);
$attdir=$avatarinfo[0];
$path='';
if(!function_exists(imagecreatefromjpeg)){
return false;
}
$img_r=imagecreatefromjpeg($src);
$srcW = ImageSX($img_r);
$srcH = ImageSY($img_r);
for($i=0;$i<=2;$i++){

$src_new=$attdir.$avatarinfo[1].'_avatar_'.$sys[$i].'.jpg';
$targ_w = $targ_h =$jo?$sys[$i]+1:$sys[$i];

$dst_r = imagecreatetruecolor( $targ_w, $targ_h );
imagecopyresampled($dst_r,$img_r,0,0,0,0,$targ_w,$targ_h,$srcW,$srcH);
imagejpeg($dst_r,$src_new,$jpeg_quality);
$path.=$i==0?SYS_URL.$src_new:"|".SYS_URL.$src_new;
}
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: