MagickWand 是 PHP 連接 ImageMagick 的官方擴展,提供物件導向 API 操作影像。相較 GD 库,支援格式更多(超過 200 種)、處理大圖記憶體效率更高、功能更強大(如向量圖形、色彩空間轉換、複雜濾鏡)。本文涵蓋安裝、兩種架構差異、基本操作範例。
| 架構 | 說明 | 優點 | 缺點 |
|---|---|---|---|
| 外掛模式 | 擴展僅提供 API,需另裝 ImageMagick 程式庫 | 檔案小(約百 KB)、可獨立升級 ImageMagick | Windows 需設定臨時目錄權限 |
| 內建模式 | 擴展編譯時已包含 ImageMagick | 免額外安裝、無臨時目錄權限問題 | 擴展檔案大(4MB+)、升級需重編譯 |
php_magickwand.dll(如 php_magickwand_q16_ts.dll for PHP 7.x TS)。ext/ 目錄。php.ini:extension=php_magickwand.dll。phpinfo() 確認 magickwand 區塊出現。<?php
// 1. 建立 MagickWand 物件
$mw = NewMagickWand();
// 2. 讀取圖片
MagickReadImage($mw, 'rose.jpg');
// 3. 建立繪圖物件
$dw = NewDrawingWand();
DrawSetFont($dw, '/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf'); // 字體路徑
DrawSetFontSize($dw, 24);
DrawSetGravity($dw, MW_CenterGravity); // 置中
// 4. 設定文字顏色(白色)
$pw = NewPixelWand();
PixelSetColor($pw, 'white');
DrawSetFillColor($dw, $pw);
// 5. 寫入文字
if (MagickAnnotateImage($mw, $dw, 0, 0, 0, 'Sample Watermark') !== 0) {
// 6. 輸出圖片
header('Content-Type: image/jpeg');
MagickEchoImageBlob($mw);
} else {
echo '錯誤:' . MagickGetExceptionString($mw);
}
// 7. 釋放資源
DestroyMagickWand($mw);
DestroyDrawingWand($dw);
DestroyPixelWand($pw);
?>
| 操作 | 關鍵函式 |
|---|---|
| 讀取圖片 | MagickReadImage / MagickReadImageBlob |
| 縮放 | MagickResizeImage / MagickThumbnailImage |
| 裁切 | MagickCropImage |
| 旋轉 | MagickRotateImage |
| 模糊/銳化 | MagickBlurImage / MagickSharpenImage |
| 色彩空間轉換 | MagickTransformImageColorspace |
| 合成/疊加 | MagickCompositeImage |
| 輸出 | MagickWriteImage / MagickEchoImageBlob / MagickGetImageBlob |
| 格式轉換 | MagickSetImageFormat |
| 品質設定 | MagickSetImageCompressionQuality |
建議:新專案優先考慮 Imagick(文件豐富、社群活躍),若追求極致效能或嵌入式環境可用 MagickWand。
/usr/share/fonts/,Windows C:/Windows/Fonts/。policy.xml 限制資源,或分塊處理大圖。MagickWand 為 PHP 專業影像處理提供工業級能力。安裝雖需額外步驟,但換來格式支援廣、大圖處理穩、功能全的優勢,遠超 GD。實務上搭配 Imagick 物件導向介面開發效率更高,兩者底層同為 ImageMagick,可依團隊習慣選擇。