關鍵要點
引言
在PHP應用中,如果需要創建縮略圖、應用圖像濾鏡或進行其他圖像轉換,就需要用到圖像處理庫。通常,你會選擇GD或ImageMagick。但哪個庫支持更多圖像格式?哪個庫速度更快?選擇合適的庫還需要考慮哪些其他因素?本文將解答這些問題!
可用性
GD和ImageMagick在PHP中可用,前提是它們已安裝並與PHP本身配置好。 GD庫從PHP 4.3開始默認包含,因此在大多數服務器環境中都可以使用。另一方面,ImageMagick並不總是可用,一些主機公司不提供它。
你可以運行幾行代碼來檢查這兩個庫的可用性。 ImageMagick的queryFormats()
和GD的gd_info()
函數還可以列出每個庫支持的圖像格式:
if (extension_loaded('gd')) { print_r(gd_info()); } else { echo 'GD不可用。'; } if (extension_loaded('imagick')) { $imagick = new Imagick(); print_r($imagick->queryFormats()); } else { echo 'ImageMagick不可用。'; }
支持的文件類型
執行上述代碼後打印出的支持圖像格式列表,首先表明ImageMagick庫的功能遠超GD。 GD僅支持JPG、PNG、GIF、WBMP、WebP、XBM和XPM文件,與ImageMagick庫處理的超過一百種文件類型相比,數量非常有限。
你可能會認為你可能永遠不會用到ImageMagick支持的所有這些不常見的格式,但這可能並非如此。在我的一個項目中,我不得不從GD切換到ImageMagick,僅僅是因為GD不支持TIFF文件。
功能
GD和ImageMagick都提供一些基本功能,例如:調整圖像大小和裁剪、創建由自定義形狀、文本和其他圖像文件組成的圖像、應用圖像濾鏡(更改亮度、對比度、著色等)。
如果你想更高級地處理圖像,請查看ImageMagick庫的所有功能。如ImageMagick示例頁面所示——第一個和第二個——你可以以無數種方式轉換、裝飾或扭曲圖像。
PHP ImageMagick類本身提供了331種方法,這是一個相當可觀的數字(不,我沒有手動數,我使用了ReflectionClass
;))。一方面,它顯示了ImageMagick庫的強大功能,另一方面,它也使得為特定用例查找和實現適當的方法變得困難。
性能
說實話,如果你只想創建一組縮略圖或對圖像應用簡單的轉換,你不必關心比較每個圖像處理庫的性能。
在我對典型服務器配置進行的一系列測試中,從3MB的數碼相機JPG圖像創建縮略圖,使用ImageMagick大約需要0.6秒,使用GD大約需要0.5秒。因此,無論使用哪個庫,整個過程都不會花費太多時間。瀏覽網絡並查找這兩個庫的速度測試後,你會很快注意到,它們在性能方面都沒有突出表現。有時GD庫運行速度更快,有時是ImageMagick——這完全取決於用例。在決定是否使用GD或ImageMagick時,不要將此標準視為關鍵因素。
編碼風格
如果你比較使用GD和ImageMagick庫編寫的相同圖像轉換代碼,你會很快注意到它們之間存在一些差異。 GD庫通過一系列函數(如getimagesize()
或imagecreatetruecolor()
)提供,因此整個圖像處理腳本需要以過程式風格編寫。讓我們來看一個創建JPG圖像縮略圖的示例:
if (extension_loaded('gd')) { print_r(gd_info()); } else { echo 'GD不可用。'; } if (extension_loaded('imagick')) { $imagick = new Imagick(); print_r($imagick->queryFormats()); } else { echo 'ImageMagick不可用。'; }
由於在發生錯誤時不會拋出異常,因此所有錯誤處理都必須通過檢查每個GD函數的結果來實現。你還必須處理具有十個參數的龐大函數,例如imagecopyresampled()
或imagecopyresized()
。我相信,如此多的參數並不是良好編碼實踐的例子。
另一個可能不太方便的事情是,讀取和保存圖像的函數取決於圖像類型而有所不同。因此,如果你希望你的縮略圖生成腳本處理不同的文件類型,你需要添加如下代碼:
$src_img = imagecreatefromjpeg('source.jpg'); if (!$src_img) { die('读取源图像时出错。'); } $thumbnail = imagecreatetruecolor(800, 800); if (!$thumbnail) { die('创建目标图像时出错。'); } $result = imagecopyresampled($thumbnail, $src_img, 0, 0, 0, 0, 800, 800, 1600, 1600); if (!$result) { die('生成缩略图时出错。'); } $result = imagejpeg($thumbnail, 'destination.jpg'); if (!$result) { die('保存缩略图时出错。'); } $result = imagedestroy($thumbnail); if (!$result) { die('销毁图像时出错。'); }
然後,你必鬚根據圖像類型執行不同的函數才能以正確的格式保存目標圖像。正如你所看到的,GD代碼很快就會變得複雜。
只需查看負責相同操作的ImageMagick代碼,你就會注意到區別:
switch ($image_type) { case 'gif': $src_img = imagecreatefromgif($path); break; case 'png': $src_img = imagecreatefrompng($path); break; case 'jpg': case 'jpeg': $src_img = imagecreatefromjpeg($path); break; default: return false; break; } //继续创建缩略图
ImageMagick庫可以通過Imagick類訪問。因此,我們可以從面向對象編程範式的所有優點中獲益。最簡單的例子是處理錯誤的方式。使用ImageMagick庫時,你只需將所有代碼包裝在一個try-catch塊中,你的應用就可以安全地執行。
如上所示,負責創建縮略圖的ImageMagick腳本不包含任何與源圖像類型相關的代碼。相同的代碼可用於處理JPG圖像以及PNG或TIF文件。如果你需要將源圖像轉換為另一種類型,只需在執行writeImage()
方法之前添加一行代碼:
try { $imagick = new Imagick(); $imagick->readImage('source.jpg'); $imagick->thumbnailImage(800, 800); $imagick->writeImage('destination.jpg'); } catch (Exception $e) { die('创建缩略图时出错:' . $e->getMessage()); }
是不是更清晰了?在我看來,使用GD庫函數處理圖像不如ImageMagick方便。當然,GD有一些可用的包裝器使其面向對象,但在這一點上,它開始感覺像是在修補補丁。
流行度
由於GD庫默認包含在所有新的PHP版本中,因此你可能在各種項目中比ImageMagick更頻繁地看到這個庫。當我的CakePHP項目需要一個負責處理圖像上傳和縮略圖生成的組件時,我很快找到了一個基於GD的適合我需求的組件。你有時可能會發現一些編寫良好的模塊,允許你在兩個圖像處理庫之間進行選擇——例如Kohana框架圖像庫,但我擔心它們並不常見。
替代方案
在決定如何在你的應用中處理圖像處理時,你不必堅持使用某個PHP庫。還有其他值得考慮的解決方案:
使用在PHP應用外部運行的圖像處理腳本。在我的一個應用中,我必須創建一個網頁,允許訪問者在線轉換圖像,就在瀏覽器窗口中。我決定使用Caman.js JavaScript圖像處理庫,它做得很好。該庫也可以用作嵌入在node.js平台中的後台腳本,node.js平台的普及率一直在穩步提高。
使用基於雲的圖像處理平台。基於雲的解決方案可以為你完成這項工作——發送源文件後,你可以獲取不同大小的縮略圖或通過各種濾鏡轉換的圖像。你不需要編寫太多代碼,而且不受服務器能力的限制。只需打開Google即可找到一些提供此類服務的公司。
檢查你正在使用的組件的功能。你可能會驚訝地發現,你可以通過使用已連接到你的應用的服務來轉換你的圖像。例如,Dropbox API提供縮略圖方法,允許你以五種可用尺寸之一獲取JPG或PNG圖像。檢查你的庫和API的文檔,你可能會發現它們可以完成你需要的操作。
總結
如你所見,每個圖像處理庫都有其優缺點。 GD庫廣泛可用,因此它可能在任何地方都能工作。由於它很流行,你很容易找到許多使用此庫的示例和組件。獲得幫助也更容易,因為更多的人可能熟悉GD庫而不是ImageMagick。
ImageMagick支持更多文件類型,並且可以比GD庫以更多方式轉換圖像。它還允許你編寫更清晰和高質量的代碼。
最後,還有其他替代方案,例如雲圖像處理服務,這些服務可能會完全消除對這兩個庫的需求。我希望本文能幫助你做出選擇。
如果你對本文有任何疑問或意見,請隨時在下方發表評論或通過Google 聯繫我。
Imagick與GD的常見問題解答(FAQ)
Imagick和GD都是功能強大的庫,用於在PHP中進行圖像處理。但是,它們在功能方面存在顯著差異。 Imagick以其廣泛的功能集而聞名,提供了各種圖像處理選項,包括高級功能,如圖層效果、圖像濾鏡和顏色調整。另一方面,GD更簡單直接,專注於基本的圖像處理任務,如調整大小、裁剪和簡單的繪圖功能。雖然GD可能足以完成簡單的任務,但Imagick通常是更複雜圖像處理需求的首選。
性能可能因具體任務和服務器環境而異。一般來說,由於其廣泛的功能集,Imagick被認為比GD更消耗資源。但是,它也往往會產生更高質量的結果,尤其是在處理複雜的圖像處理任務時。另一方面,GD通常更快且資源消耗更少,這使其成為簡單任務或資源有限的環境的良好選擇。
Imagick通常更適合處理大型圖像。這是因為Imagick支持一項名為“基於磁盤的像素緩存”的功能,這允許它處理大於可用內存的圖像。另一方面,GD不支持此功能,因此在處理大型圖像時,尤其是在內存有限的服務器上,可能會遇到困難。
Imagick和GD都支持透明度,但它們處理透明度的方式略有不同。 Imagick支持更廣泛的透明度選項,包括alpha通道和各種混合模式。另一方面,GD對透明度的支持更有限,有時難以處理複雜的透明度效果。
是的,可以在同一個項目中同時使用Imagick和GD。但是,需要注意的是,這兩個庫使用不同的語法和函數名,因此需要確保你的代碼與兩者兼容。此外,在同一個項目中同時使用這兩個庫可能會增加代碼的複雜性,並可能導致性能問題,因此通常建議盡可能選擇其中一個。
Imagick和GD都得到了廣泛的支持並積極維護。但是,GD默認包含在大多數PHP安裝中,使其更普遍可用。另一方面,Imagick通常需要單獨安裝,這有時會導致兼容性問題。
Imagick和GD都有廣泛的文檔和活躍的社區支持。但是,由於其更長的歷史和更廣泛的使用,GD在線上通常有更多現成的資源和教程。 Imagick雖然也有很好的文檔,但可能需要更多挖掘才能找到具體的解決方案或示例。
Imagick和GD都被認為是安全的庫。但是,與任何軟件一樣,如果使用不當,它們也可能被利用。務必始終使用最新版本的庫,並遵循安全編碼的最佳實踐。
選擇Imagick還是GD取決於項目的具體需求。如果需要高級圖像處理功能,或者需要處理大型圖像,Imagick可能是更好的選擇。但是,如果正在處理一個更簡單的項目,或者在資源有限的環境中工作,GD可能是更好的選擇。
雖然從技術上講可以在項目中途從GD切換到Imagick(反之亦然),但這通常不建議這樣做。這是因為這兩個庫使用不同的語法和函數名,因此切換可能需要對代碼進行重大更改。如果正在考慮切換,通常最好在項目開始時做出決定。
以上是Imagick vs GD的詳細內容。更多資訊請關注PHP中文網其他相關文章!