常見圖片格式對比
| 格式 | 壓縮方式 | 色深 | 動畫支持 | 適用場景 |
| GIF | 無損 (LZW) | 256 色 (8-bit) | ✅ 支持 | 簡單圖標、動畫、透明背景 |
| JPEG/JPG | 有損壓縮 | 24-bit (真彩色) | ❌ 不支持 | 照片、複雜圖像、Web 圖片主流格式 |
| PNG | 無損壓縮 | 24-bit + Alpha 通道 | ❌ 不支持 (APNG 除外) | 截圖、UI 元素、需透明度的圖片 |
GD 庫繪圖基本流程
- 啟用 GD 擴展 (
php.ini 中 extension=gd)
- 創建畫布 (
imagecreatetruecolor())
- 分配顏色 (
imagecolorallocate())
- 繪製圖形/文本
- 輸出圖像 (
imagepng() 等)
- 銷毀資源 (
imagedestroy())
完整繪圖示例:圖形、文本與圖片合成
<?php
// 1. 創建 400x300 真彩色畫布 (默認黑色背景)
$img = imagecreatetruecolor(400, 300);
// 2. 分配顏色 (紅色)
$red = imagecolorallocate($img, 255, 0, 0);
$blue = imagecolorallocate($img, 0, 0, 255);
$white = imagecolorallocate($img, 255, 255, 255);
// 3. 繪製各種圖形
// 矩形邊框
imagerectangle($img, 50, 20, 100, 40, $red);
// 填充矩形
imagefilledrectangle($img, 120, 20, 170, 40, $blue);
// 直線
imageline($img, 0, 0, 400, 300, $red);
// 圓形
imageellipse($img, 300, 100, 80, 80, $blue);
// 橢圓
imageellipse($img, 300, 200, 100, 50, $red);
// 圓弧
imagearc($img, 200, 150, 100, 100, 0, 180, $blue);
// 扇形 (IMG_ARC_PIE 為實心扇形)
imagefilledarc($img, 200, 150, 100, 100, 180, 270, $red, IMG_ARC_PIE);
// 4. 輸出中文文本 (需 TTF 字體文件)
$text = "PHP 繪圖技術演示";
// imagettftext(畫布, 字號, 角度, x, y, 顏色, 字體路徑, 文本)
imagettftext($img, 24, 0, 50, 250, $white, __DIR__ . '/fonts/msyhbd.ttc', $text);
// 5. 合成外部圖片 (示例:百度 Logo)
// $srcImg = imagecreatefromgif('https://www.baidu.com/img/bd_logo.gif');
// $srcInfo = getimagesize('https://www.baidu.com/img/bd_logo.gif');
// imagecopy($img, $srcImg, 10, 10, 0, 0, $srcInfo[0], $srcInfo[1]);
// 6. 輸出為 PNG 並發送到瀏覽器
header('Content-Type: image/png');
imagepng($img);
// 7. 釋放內存
imagedestroy($img);
?>
關鍵函數速查表
| 功能 | 函數 | 說明 |
| 創建畫布 | imagecreatetruecolor(w, h) | 真彩色,推薦使用 |
| 分配顏色 | imagecolorallocate(img, r, g, b) | 返回顏色標識符 |
| 填充背景 | imagefill(img, x, y, color) | 從坐標開始泛洪填充 |
| 畫直線 | imageline(img, x1, y1, x2, y2, color) | |
| 畫矩形 | imagerectangle / imagefilledrectangle | 邊框/填充 |
| 畫橢圓/圓 | imageellipse / imagefilledellipse | 寬高相等即為圓 |
| 畫圓弧/扇形 | imagearc / imagefilledarc | 角度 0-360,3點鐘方向為 0 |
| 輸出文本 | imagestring / imagettftext | TTF 支持中文、字體控制 |
| 複製圖片 | imagecopy / imagecopyresampled | 縮放複製用 resampled |
| 輸出圖像 | imagepng / imagejpeg / imagegif | 第二參數為文件名則保存 |
| 銷毀資源 | imagedestroy(img) | 必須調用,防止內存洩漏 |
最佳實踐建議
- 字體管理:將 TTF 字體文件放入項目目錄,使用絕對路徑
__DIR__ . '/fonts/xxx.ttf'
- 錯誤處理:繪圖前檢查 GD 版本
gd_info(),捕獲函數調用失敗
- 性能優化:大量生成時複用畫布、緩存字體對象、考慮使用 Imagick
- 安全性:驗證用戶輸入的坐標、顏色、文本長度,防止資源耗盡
進階:使用 Imagick 替代 GD
ImageMagick (Imagick 擴展) 提供更豐富的功能:
- 支持 100+ 格式 (含 SVG, HEIC, WebP 等)
- 矢量繪圖、濾鏡特效、色彩空間轉換
- 更優的內存管理與多線程支持
- API 更現代化 (面向對象、鏈式調用)
$im = new Imagick();
$im->newImage(400, 300, 'white');
$draw = new ImagickDraw();
$draw->setFillColor('red');
$draw->rectangle(50, 20, 100, 40);
$draw->setFont(__DIR__ . '/fonts/msyhbd.ttc');
$draw->setFontSize(24);
$draw->annotation(50, 250, 'PHP 繪圖技術');
$im->drawImage($draw);
$im->setImageFormat('png');
header('Content-Type: image/png');
echo $im;