對於網站前端上傳的圖片,在后台處理時有必要對其進行縮放以生成大小統一的縮略圖。在PHP中,可以很方便的使用GD庫來完成這一任務。下面的CImage類的靜態方法CreateThumbnail()函數可以接受原圖像文件名稱,縮略圖寬高,生成的縮略圖文件名稱等參數來生成保持原圖縱橫比的縮略圖。函數基本上體現了PHP生成縮略圖的方法,功能上還可以作進一步的擴充,如根據縮略圖文件名稱來生成指定格式的縮略圖。
完整代碼如下(Win7+XAMPP2.5及Linuxdev 2.6.18-128+apache測試通過):
1 //by MoreWindows (http://blog.csdn.net/MoreWindows ) 2 class CImage 3 { 4 /** 5 * 生成保持原圖縱橫比的縮略圖,支持.png .jpg .gif 6 * 縮略圖類型統一為.png格式 7 * $srcFile 原圖像文件名稱 8 * $toW 縮略圖寬 9 * $toH 縮略圖高 10 * $toFile 縮略圖文件名稱,為空覆蓋原圖像文件 11 * @return bool 12 */ 13 public static function CreateThumbnail($srcFile, $toW, $toH, $toFile="") 14 { 15 if ($toFile == "") 16 { 17 $toFile = $srcFile; 18 } 19 $info = ""; 20 //返回含有4個單元的數組,0-寬,1-高,2-圖像類型,3-寬高的文本描述。 21 //失敗返回false並產生警告。 22 $data = getimagesize($srcFile, $info); 23 if (!$data) 24 return false; 25 26 //將文件載入到資源變量im中 27 switch ($data[2]) //1-GIF,2-JPG,3-PNG 28 { 29 case 1: 30 if(!function_exists("imagecreatefromgif")) 31 { 32 echo "the GD can't support .gif, please use .jpeg or .png! <a href='javascript:history.back();'>back</a>"; 33 exit(); 34 } 35 $im = imagecreatefromgif($srcFile); 36 break; 37 38 case 2: 39 if(!function_exists("imagecreatefromjpeg")) 40 { 41 echo "the GD can't support .jpeg, please use other picture! <a href='javascript:history.back();'>back</a>"; 42 exit(); 43 } 44 $im = imagecreatefromjpeg($srcFile); 45 break; 46 47 case 3: 48 $im = imagecreatefrompng($srcFile); 49 break; 50 } 51 52 //計算縮略圖的寬高 53 $srcW = imagesx($im); 54 $srcH = imagesy($im); 55 $toWH = $toW / $toH; 56 $srcWH = $srcW / $srcH; 57 if ($toWH <= $srcWH) 58 { 59 $ftoW = $toW; 60 $ftoH = (int)($ftoW * ($srcH / $srcW)); 61 } 62 else 63 { 64 $ftoH = $toH; 65 $ftoW = (int)($ftoH * ($srcW / $srcH)); 66 } 67 68 if (function_exists("imagecreatetruecolor")) 69 { 70 $ni = imagecreatetruecolor($ftoW, $ftoH); //新建一個真彩色圖像 71 if ($ni) 72 { 73 //重采樣拷貝部分圖像並調整大小 可保持較好的清晰度 74 imagecopyresampled($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH); 75 } 76 else 77 { 78 //拷貝部分圖像並調整大小 79 $ni = imagecreate($ftoW, $ftoH); 80 imagecopyresized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH); 81 } 82 } 83 else 84 { 85 $ni = imagecreate($ftoW, $ftoH); 86 imagecopyresized($ni, $im, 0, 0, 0, 0, $ftoW, $ftoH, $srcW, $srcH); 87 } 88 89 //保存到文件 統一為.png格式 90 imagepng($ni, $toFile); //以 PNG 格式將圖像輸出到瀏覽器或文件 91 ImageDestroy($ni); 92 ImageDestroy($im); 93 return true; 94 } 95 }