PHP中GD庫的使用

broadviewbj發表於2012-11-22

在PHP中,有一些簡單的影像函式是可以直接使用的,但大多數要處理的影像,都需要在編譯PHP時加上GD庫。除了安裝GD庫之外,在PHP中還可能需要其他的庫,這可以根據需要支援哪些影像格式而定。GD庫可以在免費下載,不同的GD版本支援的影像格式不完全一樣,最新的GD庫版本支援GIF、JPEG、PNG、WBMP、XBM等格式的影像檔案,此外還支援一些如FreeType、Type 1等字型庫。透過GD庫中的函式可以完成各種點、線、幾何圖形、文字及顏色的操作和處理,也可以建立或讀取多種格式的影像檔案。

在PHP中,透過GD庫處理影像的操作,都是先在記憶體中處理,操作完成以後再以檔案流的方式,輸出到瀏覽器或儲存在伺服器的磁碟中。建立一個影像應該完成如下所示的4個基本步驟。
(1)建立畫布:所有的繪圖設計都需要在一個背景圖片上完成,而畫布實際上就是在記憶體中開闢的一塊臨時區域,用於儲存影像的資訊。以後的影像操作都將基於這個背景畫布,該畫布的管理就類似於我們在畫畫時使用的畫布。
(2)繪製影像:畫布建立完成以後,就可以透過這個畫布資源,使用各種畫像函式設定影像的顏色、填充畫布、畫點、線段、各種幾何圖形,以及向影像中新增文字等。
(3)輸出影像:完成整個影像的繪製以後,需要將影像以某種格式儲存到伺服器指定的檔案中,或將影像直接輸出到瀏覽器上顯示給使用者。但在影像輸出之前,一定要使用header()函式傳送Content-type通知瀏覽器,這次傳送的是圖片不是文字。
(4)釋放資源:影像被輸出以後,畫布中的內容也不再有用。出於節約系統資源的考慮,需要及時清除畫布佔用的所有記憶體資源。
我們先來了解一個非常簡單的建立影像指令碼。在下面的指令碼檔案image.php中,按前面介紹的繪製影像的四個步驟,使用GD庫動態輸出一個扇形統計圖。程式碼如下所示:

直接透過瀏覽器請求該指令碼,或是將該指令碼所在的URL,賦給HTML中IMG標記的src屬性,都可以獲取動態輸出的影像結果,如圖16-1所示。

圖16-1 使用PHP的GD庫動態繪製統計圖
畫布管理
使用PHP的GD庫處理影像時,必須對畫布進行管理。建立畫布就是在記憶體中開闢一塊儲存區域,以後在PHP中對影像的所有操作都是基於這個圖布處理的,圖布就是一個影像資源。在PHP中,可以使用imagecreate()和imageCreateTrueColor()兩個函式建立指定的畫布。這兩個函式的作用是一致的,都是建立一個指定大小的畫布,它們的原型如下所示:

雖然這兩個函式都可以建立一個新的畫布,但各自能夠容納顏色的總數是不同的。imageCreate()函式可以建立一個基於普通調色盤的影像,通常支援256色。而imageCreateTrueColor()函式可以建立一個真彩色影像,但該函式不能用於GIF檔案格式。當畫布建立後,返回一個影像識別符號,代表了一幅寬度為$x_size和高度為$y_size的空白影像引用控制程式碼。在後續的繪圖過程中,都需要使用這個資源型別的控制程式碼。例如,可以透過呼叫imagex()和imagey()兩個函式獲取影像的大小。程式碼如下所示:
 
 
另外,畫布的引用控制程式碼如果不再使用,一定要將這個資源銷燬,釋放記憶體與該影像的儲存單元。畫布的銷燬過程非常簡單,呼叫imagedestroy()函式就可以實現。其語法格式如下所示:

 

 
如果該方法呼叫成功,就會釋放與引數$image關聯的記憶體。其中引數$image是由影像建立函式返回的影像識別符號。
設定顏色
在使用PHP動態輸出美麗影像的同時,也離不開顏色的設定,就像畫畫時需要使用調色盤一樣。設定影像中的顏色,需要呼叫imageColorAllocate()函式完成。如果在影像中需要設定多種顏色,只要多次呼叫該函式即可。該函式的原型如下所示:
 
該函式會返回一個識別符號,代表了由給定的RGB成分組成的顏色。引數$red、$green和$blue分別是所需要的顏色的紅、綠、藍成分。這些引數是0到255的整數或者十六進位制的0x00到0xFF。第一個引數$image是畫布影像的控制程式碼,該函式必須呼叫$image所代表的影像中的顏色。但要注意,如果是使用imagecreate()函式建立的畫布,則第一次對imagecolorallocate()函式的呼叫,會給基於調色盤的影像填充背景色。該函式的使用程式碼如下所示:

生成影像
使用GD庫中提供的函式動態繪製完成影像以後,就需要輸出到瀏覽器或者將影像儲存起來。在PHP中,可以將動態繪製完成的畫布,直接生成GIF、JPEG、PNG和WBMP四種影像格式。可以透過呼叫下面四個函式生成這些格式的影像:

以上四個函式的使用類似,前兩個引數的使用是相同的。第一個引數$image為必選項,是前面介紹的影像引用控制程式碼。如果不為這些函式提供其他引數,訪問時則直接將原影像流輸出,並在瀏覽器中顯示動態輸出的影像。但一定要在輸出之前,使用header()函式傳送標頭資訊,用來通知瀏覽器使用正確的MIME型別對接收的內容進行解析,讓它知道我們傳送的是圖片而不是文字的HTML。以下程式碼段透過自動檢測GD庫支援的影像型別,來寫出移植性更好的PHP程式。如下所示:

如果希望將PHP動態繪製的影像儲存在本地伺服器上,則必須在第二個可選引數中指定一個檔名字串。這樣,不僅不會將影像直接輸出到瀏覽器,也不需要使用header()函式傳送標頭資訊。
如果使用imageJPEG()函式生成JPEG格式的影像,還可以透過第三個可選引數$quality指定JPEG格式影像的品質,該引數可以提供的值是從0(最差品制,但檔案最小)到100(最高品質,檔案也最大)的整數,預設值為75。也可以為函式imageWBMP()提供第三個可選引數$forground,指定影像的前景顏色,預設顏色值為黑色。
 
 
本文節選自《細說PHP(第2版)》

LAMP兄弟連 組編
電子工業出版社出版

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-749722/,如需轉載,請註明出處,否則將追究法律責任。

相關文章