對於網站前端上傳的圖片,在幕後處理時有必要對其進行縮放以產生大小統一的縮圖。在PHP中,可以很方便的使用GD庫來完成這一任務。下面的CImage類的靜態方法CreateThumbnail()函數可以接受原影像檔名稱,縮圖寬高,產生的縮圖檔案名稱等參數來產生保持原圖縱橫比的縮圖。函數基本上體現了PHP產生縮圖的方法,功能上還可以作進一步的擴充,如根據縮圖檔案名稱來產生指定格式的縮圖。
完整代碼如下(Win7+XAMPP2.5及Linuxdev 2.6.18-128+apache測試通過):
//by MoreWindows (http://blog.csdn.net/MoreWindows )class CImage{/** * 產生保持原圖縱橫比的縮圖,支援.png .jpg .gif * 縮圖類型統一為.png格式 * $srcFile 原影像檔名稱 * $toW 縮圖寬 * $toH 縮圖高 * $toFile 縮圖檔案名稱,為空白覆蓋原影像檔 * @return bool */public static function CreateThumbnail($srcFile, $toW, $toH, $toFile="") {if ($toFile == ""){ $toFile = $srcFile; }$info = "";//返回含有4個單元的數組,0-寬,1-高,2-映像類型,3-寬高的文本描述。//失敗返回false併產生警告。$data = getimagesize($srcFile, $info);if (!$data)return false;//將檔案載入到資源變數im中switch ($data[2]) //1-GIF,2-JPG,3-PNG{ case 1:if(!function_exists("imagecreatefromgif")){echo "the GD can't support .gif, please use .jpeg or .png! <a href='javascript:history.back();'>back</a>";exit();}$im = imagecreatefromgif($srcFile);break; case 2:if(!function_exists("imagecreatefromjpeg")){echo "the GD can't support .jpeg, please use other picture! <a href='javascript:history.back();'>back</a>";exit();}$im = imagecreatefromjpeg($srcFile);break; case 3:$im = imagecreatefrompng($srcFile); break;}//計算縮圖的寬高$srcW = imagesx($im);$srcH = imagesy($im);$toWH = $toW / $toH;$srcWH = $srcW / $srcH;if ($toWH <= $srcWH) {$ftoW = $toW;$ftoH = (int)($ftoW * ($srcH / $srcW));}else {$ftoH = $toH;$ftoW = (int)($ftoH * ($srcW / $srcH));}if (function_exists("imagecreatetruecolor")) {$ni = imagecreatetruecolor($ftoW, $ftoH); //建立一個真彩色映像if ($ni) {//重採樣拷貝部分映像並調整大小 可保持較好的清晰度imagecopyresampled($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);} else {//拷貝部分映像並調整大小$ni = imagecreate($ftoW, $ftoH);imagecopyresized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);}}else {$ni = imagecreate($ftoW, $ftoH);imagecopyresized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH);}//儲存到檔案 統一為.png格式imagepng($ni, $toFile); //以 PNG 格式將映像輸出到瀏覽器或檔案ImageDestroy($ni);ImageDestroy($im);return true;}}
轉載請標明出處,原文地址:http://blog.csdn.net/morewindows/article/details/7062506