對於網站前端上傳的圖片,在後台處理時有必要對其進行縮放以生成大小統一的縮略圖。在PHP中,可以很方便的使用GD庫來完成這一任務。下面的CImage類的靜態方法CreateThumbnail()函數可以接受原圖像文件名稱,縮略圖寬高,生成的縮略圖文件名稱等參數來生成保持原圖縱橫比的縮略圖。函數基本上體現了PHP生成縮略圖的方法,功能上還可以作進一步的擴充,如根據縮略圖文件名稱來生成指定格式的縮略圖。
完整代碼如下(Win7+XAMPP2.5及Linuxdev 2.6.18-128+apache測試通過):
//by MoreWindows ( http://www.BkJia.com )
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;
}
摘自 MoreWindows