PHP程序開發(fā)過(guò)程中經(jīng)常會(huì)碰到這樣的問(wèn)題,根據(jù)網(wǎng)頁(yè)前臺(tái)要求對(duì)原圖片進(jìn)行處理,生成符合網(wǎng)頁(yè)前端尺寸要求的縮略圖,同時(shí),還要滿足居中展示和PNG背景透明的要求。
舉個(gè)例子,有一張800*600的圖片,網(wǎng)頁(yè)前端縮略圖尺寸是200*200,PHP需要對(duì)這個(gè)圖片進(jìn)行以下處理。
1、壓縮尺寸,將圖片等比壓縮到200*150,注意,這里的尺寸并不是200*200,因?yàn)樵瓐D并不是正方形的圖片,寬度只有600;
2、新建一個(gè)畫布,背景色為白色,根據(jù)圖片格式,如果是PNG或GIF圖片,設(shè)置背景完全透明;
3、將之前壓縮成200*150的圖片放入畫布中,注意x軸需要偏移(200-150)/2=25px,這樣才能在畫布中居中。
流程已經(jīng)清楚了,接下一就是代碼編寫了,以下是相應(yīng)的函數(shù)代碼,轉(zhuǎn)載請(qǐng)注明出處:江西居道科技有限公司 m.xhjnt.cn
/** * 生成裁剪圖函數(shù)(支持圖片格式:gif、jpeg、png和bmp) * @param string $src 源圖片路徑 * @param int $width 縮略圖寬度(只指定高度時(shí)進(jìn)行等比縮放) * @param int $width 縮略圖高度(只指定寬度時(shí)進(jìn)行等比縮放) * @param string $filename 保存路徑(不指定時(shí)直接輸出到瀏覽器) * @return bool */ function cutThumb($src, $width = null, $height = null, $filename = null) { if (!isset($width) && !isset($height)) return false; if (isset($width) && $width < 0) return false; if (isset($height) && $height < 0) return false; if(empty($width) && empty($height)) return false; $size = getimagesize($src); if (!$size) return false; list($src_w, $src_h, $src_type) = $size; $src_mime = $size['mime']; switch($src_type) { case 1 : $img_type = 'gif'; break; case 2 : $img_type = 'jpeg'; break; case 3 : $img_type = 'png'; break; case 15 : $img_type = 'wbmp'; break; default : return false; } if(empty($width)) $width=$height; if(empty($height)) $height=$width; $rate_h = $height/$src_h; $rate_w = $width/$src_w; //縮放比例 //以大的比例進(jìn)行縮放 $rate = $rate_h<$rate_w?$rate_w:$rate_h; //獲取縮放后的圖片大小,及裁剪的左上角位置 if($rate<1){ $w = $src_w*$rate; $h = $src_h*$rate; $x = ($w-$width)/2; $y = ($h-$height)/2; }else{ //不需要進(jìn)行縮放 $w = $src_w; $h = $src_h; $x=0;$y=0; //超出的一邊進(jìn)行裁剪 if($w>$width){ $x = ($w-$width)/2; } if($h>$height){ $y = ($h-$height)/2; } } $imagecreatefunc = 'imagecreatefrom' . $img_type; $src_img = $imagecreatefunc($src); imagesavealpha($src_img,true); //先進(jìn)行縮放 $resize_img = imagecreatetruecolor($w, $h); imagealphablending($resize_img,false);//這里很重要,意思是不合并顏色,直接用$img圖像顏色替換,包括透明色; imagesavealpha($resize_img,true);//這里很重要,意思是不要丟了$thumb圖像的透明色; imagecopyresampled($resize_img, $src_img,0, 0, 0, 0, $w, $h, $src_w, $src_h); //完成縮放,再進(jìn)行裁剪 $dest_img = imagecreatetruecolor($width, $height); imagealphablending($dest_img,false);//這里很重要,意思是不合并顏色,直接用$img圖像顏色替換,包括透明色; imagesavealpha($dest_img,true);//這里很重要,意思是不要丟了圖像的透明色; if ($img_type!='png' && $img_type!='gif'){ $bg = imagecolorallocate($dest_img,255,255,255); //設(shè)置背景色為白色, }else{ $bg = imagecolorallocatealpha($dest_img,255,255,255,127); //設(shè)置背景色為白色,127表示背景完全透明 } imagecolortransparent($dest_img,$bg); //設(shè)置透明 imagefill($dest_img,0,0,$bg); imagecopyresampled($dest_img, $resize_img, ($width-$w)/2, ($height-$h)/2,0, 0,$w, $h, $w, $h); //這里不需要再進(jìn)行縮放,直接裁剪就可以,所以后面4個(gè)參數(shù)兩兩相同 $imagefunc = 'image' . $img_type; if ($filename) { $imagefunc($dest_img, $filename,$img_type=='png'?CONST_IMGQUALITY/10:CONST_IMGQUALITY); //PNG格式的圖片質(zhì)量值介于0-9之間 } else { header('Content-Type: ' . $src_mime); $imagefunc($dest_img); } imagedestroy($src_img); imagedestroy($resize_img); imagedestroy($dest_img); return true; }
PHP生成指定大小的背景透明且尺寸固定居中顯示的縮略圖 下載