1. 程式人生 > >PHP中的GD庫的使用

PHP中的GD庫的使用

最近在學習,PHP中GD庫的影象處理,看到兄弟連部落格上的這篇文章很受用,給大家分享一下

學習交流。

在PHP中,有一些簡單的影象函式是可以直接使用的,但大多數要處理的影象,都需要在編譯PHP時加上GD庫。除了安裝GD庫之外,在PHP中還可能需要其他的庫,這可以根據需要支援哪些影象格式而定。GD庫可以在http://www.boutell.com/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,指定影象的前景顏色,預設顏色值為黑色。