PHP创建缩略图造成图片质量低下的完美解决方法

近期弄个论坛,在首页要有个排名,显示评论最多的前十位用户的列表,列表有个略图是用户最新上传的作品,如果使用原来的图,图片过大,首页加载过慢,因此要使用略图

以上来使用imagecopyresized这个函数,显示质量很差如图

后来改用imagecopyresampled效果明显改变效果如图

付上完整代码

  1 /**
  2 * @name    thum     缩略图函数
  3 * @param    sting    $img_name    图片路径
  4 * @param    int        $max_width    略图最大宽度
  5 * @param    int        $max_height    略图最大高度
  6 * @param    sting    $suffix 略图后缀(如"img_x.jpg"代表小图,"img_m.jpg"代表中图,"img_l.jpg"代表大图)
  7 * @return    void
  8 */
  9 function thum($img_name,$max_width,$max_height,$suffix){
 10         $img_infos=getimagesize($img_name);
 11         $img_height=$img_infos[0];//图片高
 12         $img_width=$img_infos[1];//图片宽
 13         $img_extension='';//图片后缀名
 14         switch($img_infos[2]){
 15             case 1:
 16                 $img_extension='gif';
 17                 break;
 18             case 2:
 19                 $img_extension='jpeg';
 20                 break;
 21             case 3:
 22                 $img_extension='png';
 23                 break;
 24             default:
 25                 $img_extension='jpeg';
 26                 break;
 27             }
 28         $new_img_size=get_thum_size($img_width,$img_height,$max_width,$max_height);//新的图片尺寸
 29         
 30         
 31         //print_r($new_img_size);
 32         //die('test');
 33         $img_func='';//函数名称
 34         $img_handle='';//图片句柄
 35         $thum_handle='';//略图图片句柄
 36         switch($img_extension){
 37             case 'jpg':
 38                 $img_handle=imagecreatefromjpeg($img_name);
 39                 $img_func='imagejpeg';
 40                 break;
 41             case 'jpeg':
 42                 $img_handle=imagecreatefromjpeg($img_name);
 43                 $img_func='imagejpeg';
 44                 break;
 45             case 'png':
 46                 $img_handle=imagecreatefrompng($img_name);
 47                 $img_func='imagepng';
 48                 break;
 49             case 'gif':
 50                  $img_handle=imagecreatefromgif($img_name);
 51                 $img_func='imagegif';
 52                 break;
 53             default:
 54                 $img_handle=imagecreatefromjpeg($img_name);
 55                 $img_func='imagejpeg';
 56                 break;
 57             }
 58         /****/    
 59         $quality=100;//图片质量
 60         if($img_func==='imagepng' && (str_replace('.', '', PHP_VERSION)>= 512)){//针对php版本大于5.12参数变化后的处理情况
 61             $quality=9;
 62             } 
 63         /****/
 64         $thum_handle=imagecreatetruecolor($new_img_size['height'],$new_img_size['width']);
 65         if(function_exists('imagecopyresampled')){
 66             imagecopyresampled($thum_handle,$img_handle, 0, 0, 0, 0,$new_img_size['height'],$new_img_size['width'],$img_height,$img_width);
 67             }else{
 68                 imagecopyresized($thum_handle,$img_handle, 0, 0, 0, 0,$new_img_size['height'],$new_img_size['width'],$img_height,$img_width);
 69             }
 70         call_user_func_array($img_func,array($thum_handle,get_thum_name($img_name,$suffix),$quality));
 71         imagedestroy($thum_handle);//清除句柄
 72         imagedestroy($img_handle);//清除句柄
 73     }
 74 
 75 /**
 76 * @name get_thum_size 获得缩略图的尺寸
 77 * @param    $width    图片宽
 78 * @param    $height 图片高
 79 * @param    $max_width 最大宽度
 80 * @param    $maxHeight 最大高度
 81 * @param    array $size;
 82 */
 83 function get_thum_size($width,$height,$max_width,$max_height){
 84     $now_width=$width;//现在的宽度
 85     $now_height=$height;//现在的高度
 86     $size=array();
 87     if($now_width>$max_width){//如果现在宽度大于最大宽度
 88         $now_height*=number_format($max_width/$width,4);
 89         $now_width=    $max_width;
 90         }
 91     if($now_height>$max_height){//如果现在高度大于最大高度
 92         $now_width*=number_format($max_height/$now_height,4);
 93         $now_height=$max_height;
 94         }
 95     $size['width']=floor($now_width);
 96     $size['height']=floor($now_height);
 97     return $size;
 98     }
 99 
100 /**
101 *@ name     get_thum_name 获得略图的名称(在大图基础加_x)
102 */
103 function get_thum_name($img_name,$suffix){
104         $str=explode('#',$img_name);
105         $str1=explode('.',$str[1]);
106         return $str[0].'_'.$suffix.'.'.$str1[1];
107     }

http://blog.csdn.net/painsonline/article/details/8198780

原文地址:https://www.cnblogs.com/gzmg/p/3463430.html