PHP创建缩略图的最终方案

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

前一篇文章说了一下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;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值