前一篇文章说了一下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;
}
本文介绍了如何使用PHP解决imagecopyresampled创建缩略图时的奇偶问题,通过调整目标宽度来确保图像清晰。通过检查原图和目标尺寸的奇偶性,适当增加1像素,避免缩略图模糊。提供了用于生成不同尺寸头像的代码示例。
250

被折叠的 条评论
为什么被折叠?



