對於網站前端上傳的圖片,在幕後處理時有必要對其進行縮放以產生大小統一的 縮圖。在PHP中,可以很方便的使用GD庫來完成這一任務。下面的CImage類的靜態方法CreateThumbnail()函數可以接受原影像檔 名稱,縮圖寬高,產生的縮圖檔案名稱等參數來產生保持原圖縱橫比的縮圖。函數基本上體現了PHP產生縮圖的方法,功能上還可以作進一步的擴充,如 根據縮圖檔案名稱來產生指定格式的縮圖。
完整代碼如下(Win7+XAMPP2.5及Linuxdev 2.6.18-128+apache測試通過):
[php] view plain copy
//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! back"; exit(); } $im = imagecreatefromgif($srcFile); break; case 2: if(!function_exists("imagecreatefromjpeg")) { echo "the GD can't support .jpeg, please use other picture! back"; 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