利用PHP創建圖像是相當容易的一件事情。只要安裝一些第三方的庫文件並具有一定的幾何知識,就可以利用PHP來創建和處理圖像了。目前PHP使用GD庫處理圖像。在PHP中一些圖像函數是可以直接使用的,但是大多數函數需要安裝GD函數庫。GD庫提供一系列函數進行畫圖、使用顏色、處理預存的圖像和填充操作。GD庫是Thomas Boutell設計的ANSI C語言編寫,同時支持在perl、Tcl語言中作圖。由於GD是一個可以被建立成共享或靜態的庫,所以在PHP使用GD庫進行圖像操作是非常容易的。GD圖像庫工作原理見圖1。
圖1 PHP圖像調用原理
GD庫目前由Boutell公司維護,官方網址是:http://www.boutell.com/gd/ ,本文寫作時的最新版本是:2004年11月03日4發布的gd 2.0.33。 一. PHP支持的圖像格式和字體
GD庫版本PHP支持以下圖像格式和字體:
1.PNG
PNG(Portable Network Graphics)是一種能存儲32位信息的位圖文件格式,其圖像質量遠勝過gif。同gif一樣,png也使用無損壓縮方式來減少文件的大小。在壓縮位圖數據時,它采用了頗受好評的l z77算法的一個變種。目前,越來越多的軟件開始支持這一格式,在不久的將來,它可能會在整個Web上廣泛流行。png圖像可以是灰階的(16位)或彩色的(48位),也可以是8位的索引色。png圖像使用的是高速交替顯示方案,顯示速度很快,只需要下載1/64的圖像信息就可以顯示出低分辨率的預覽圖像。與gif不同的是,png圖像格式不支持動畫。PNG是PHP支持的確省圖像格式。
2.JPEG
JPEG(Joint Photographic EXPert Group)是24位的圖像文件格式,也是一種高效率的壓縮格式,文件格式是JPEG(聯合圖像專家組)標准的產物,該標准由ISO與CCITT(國際電報電話咨詢委員會)共同制定,是面向連續色調靜止圖像的一種壓縮標准。其最初目的是使用64Kbps的通信線路傳輸720×576分辨率壓縮後的圖像。通過損失極少的分辨率,可以將圖像所需存儲量減少至原大小的10%。由於其高效的壓縮效率和標准化要求,目前已廣泛用於彩色傳真、靜止圖像、電話會議、印刷及新聞圖片的傳送上。但那些被刪除的資料無法在解壓時還原,所以jpeg文件並不適合放大觀看,輸出成印刷品時品質也會受到影響。一般情況下,jpeg文件只有幾十KB,而色彩數最高可達到24位,所以它被廣泛運用在互聯網上,以節約寶貴的網絡傳輸資源。
3.WBMP
WBMP (Wireless Bitmap)即無線位圖是專為行動通訊裝置如行動電話和 PDA 等設計的圖像格式。這種格式用於無線通訊協議 (WAP) 網頁。WBMP 是 1 位的格式,因此只有兩種顏色是可見的:黑色和白色。
4.XBM
XBM(X BitMap)是一種圖形文件格式。是一種古老但通用的圖像文件格式,它與現在的許多Web浏覽器都兼容。X-Windows圖形界面(UNIX和Linux常用的GUI)的C代碼庫xlib中有一個組件專門描述了它的規范。XBM格式本來是為存儲單色的系統位圖而設計的,比如圖標和鼠標指針。XBM圖形的實質上是使用16進制數組來表示二進制圖像的C源代碼文件。X-Bitmaps是生成簡單Web圖形的一個有意思的選擇,它不需要其它的東西,只要有浏覽器就可以工作。
5.GIF
GIF(Graphics Interchange Format)是在各種平台的各種圖形處理軟件上均能夠處理的、經過壓縮的一種圖形文件格式。GIF文件的數據是基於LZW算法的連續色調的無損壓縮格式。其壓縮率一般在50%左右,它不屬於任何應用程序。目前幾乎所有相關軟件都支持它,公共領域有大量的軟件在使用GIF圖像文件。由於Unisys公司專利原因(GIF 格式使用的 LZW 演算法牽涉到 Unisys 的專利權)PHP一度它不支持GIF格式。如果你非常喜歡這種格式,可以在http://www.linuxguruz.org/downloads/gd1.3.tar.gz 下載這個早期版本不過並不推薦使用。有關GIF格式專利問題的更多信息請看網頁: http://lpf.ai.mit.edu/Patents/Gif/Gif.Html 。
6. TrueType 字體
TrueType就是打印和屏幕都適用的可縮放字體。最先由Apple公司開發,是目前計算機上的主要字體類型。位圖字體僅能以它們的單個固定大小來顯示比例,TrueType字體會以三種不同的大小來顯示比例。
7. PostScript字體
PostScript最先由Adobe公司開發,是一種頁面描述語言,用來描述圖形和文本輸出(通常是至 PostScript 打印機)的位置和外觀。PostScript 打印機可打開由任何類型的字體所創建的文本,但為最大程度上利用 PostScript 的性能,用戶需要專用的 PostScript 字體。PostScript 字體通常稱為打印機字體。
二、為PHP配置圖像和字體庫從PHP4.3開始,PHP捆綁了自己版本的GD2庫。在Windows平台GD2庫自動支持PNG、JPEG格式。如果希望在Unix、BSD、Linux平台使用PNG格式則需要安裝二個動態鏈接函數庫libpng和zlib。可以飽含在Linux發行版本的rpm包或者其官方網址下載源代碼編譯。
zlib庫:http://www.gzip.org/zlib/
編譯時注意使用如下命令行選項:
./configure --with-zlib-dir=/path/to/zlib
libpng庫:http://www.libpng.org/pub/png/
編譯時注意使用如下命令行選項:
./configure --with-png-dir=/path/to/libpng
如果希望在Unix、BSD、Linux平台使用JPEG需要安裝jpeg-6d庫然後重新編譯GD庫。可以在其官方網址下載源代碼編譯。
jpeg-6d庫:FTP://ftp.uu.net/graphics/jpeg/
編譯時注意使用如下命令行選項:
./configure --with-jpeg-dir=/path/to/jpeg-6b
如果希望在Unix、BSD、Linux平台使用TrueType 字體需要安裝TrueType 庫。可以在其官方網址下載源代碼編譯。
TrueType庫:http://www.freetype.org/
如果希望在Unix、BSD、Linux平台使用PostScript Type 1字體需要安裝t1lib庫。可以在其官方網址下載源代碼編譯。
PostScript Type 1庫:ftp://sunsite.unc.edu/pub/Linux/libs/graphics/
編譯時注意使用如下命令行選項:
./configure --with-t1lib[=path/to/t1lib]
以上所有庫編譯結束後,重新啟動Apache服務器後運行phpinfo()來檢查一下新的設置是否生效了。如果出現如下選項,見圖2.
圖2 GD庫配置界面
從圖2可以看到為PHP配置圖像和字體已經完成。現在,我們就可以開始圖像創建工作了。
三、創建圖像步驟在PHP中創建一個圖像通常需要以下四個步驟:
1. 創建一個背景圖像,以後所以操作但是基於此背景。
2. 在圖像上繪圖輪廓或或者輸入文本。
3. 輸出最終圖形。
4. 清除內存中所有資源。
下面我們看一個應用實例,一個帶“PHP”標簽的正方型。腳本如下:
<?php
$height = 300;
$width = 300;
$im = ImageCreateTrueColor($width, $height);
$white = ImageColorAllocate ($im, 255, 255, 255);
$blue = ImageColorAllocate ($im, 0, 0, 64);
ImageFill($im, 0, 0, $blue);
ImageLine($im, 0, 0, $width, $height, $white);
ImageString($im, 4, 80, 150, 'PHP', $white);
Header ('Content-type: image/png');
ImagePng ($im);
ImageDestroy($im);
?>
最後把這一小段腳本保存為si1.php,然後用浏覽器對它進行訪問,就可以看到一個300×300像素大小的PNG格式的圖像,見圖3。
圖3 PNG圖像格式輸出到浏覽器的界面
下面我們詳細講解創建圖像過程:1. 創建一個背景圖
要在PHP中建立或者修改一個圖像,必須首先建立一個圖像標示符號。這裡提供調用函數:來實現,如下所示:
$im = ImageCreateTrueColor($width, $height)
然後為這個函數傳遞兩個參數:第一個是新圖像寬度,第二個是新圖像高度。該函數將返回新圖像的標示符號。
2. 在圖像上繪圖、打印文本
在一個圖像上繪圖和打印文本需要兩個步驟:1.首先選擇顏色。這裡通過調用函數$im = ImageCreateTrueColor()為圖像選擇顏色。顏色由紅、綠、藍(RGB)值的組合決定。這裡使用了兩種顏色:
$white = ImageColorAllocate ($im, 255, 255, 255);
$blue = ImageColorAllocate ($im, 0, 0, 64);
然後需要使用其他函數將顏色繪制到圖像中。這些函數的選擇取決於要繪制的內容:直線、弧形、多邊行或者文本。上面的腳本si1.php,一共使用了三個函數:
ImageFill($im, 0, 0, $blue);
這個函數以圖像標示符號、繪圖區域的起始坐標(X和Y)以及顏色為參數。{注意PHP中圖像的起始坐標從左上角開始,該點坐標為X=0,Y=0.圖像右下角的坐標X=$width ,Y=$height。這於常規作圖習慣是相反的。}
ImageLine($im, 0, 0, $width, $height, $white);
這個函數以圖像標示符號、直線的起始點的X和Y坐標以及顏色為參數。這樣就從左上角(0,0)開始劃一條直線到圖像右下角($width, $height)。
最後我們在該圖像中添加一共標簽:
ImageString($im, 4, 50, 150, ‘PHP’, $white);
這個函數以圖像標示符號、字體、文本的起始坐標(X和Y)以及顏色為參數。字體參數值范圍從1-5之間的數字。這裡選擇的是TrueType字體。
3.輸出最終圖形
可以將圖像輸出到浏覽器或者一共文件。上面的例子中直接輸出到浏覽器。包括兩個部分:.
A.首先告訴Web浏覽器我們輸出的是一個圖像而不是文本或者HTML。
我們發送一個圖形頭來“欺騙”浏覽器,使它認為我們的PHP頁面是一幅真正的圖像,這樣它才可以正確顯示在屏幕上。服務器將以二進制數據流的形式把程序產生的信息發送到浏覽器。這裡使用函數指定圖像的MIME類型來完成:
Header (‘Content-type: image/png’);
通常在使用浏覽器接受一共文件時候,Apache Web服務器首先發送的內容是MIME類型。對於PHP頁面是:
Content-type: text/html
B.發送標題數據後,下面使用如下函數輸出圖像數據。
ImagePng ($im);
該函數以PNG格式將輸出內容發送到浏覽器。
C. 清除資源
當完成對一共圖像的處理後,應當使用銷毀圖像標示符號,然後將所占用的選題資源返回給Web服務器。這裡調用函數ImageDestroy()完成:
ImageDestroy():
ImageDestroy($im);
這樣作是為了降低CPU負荷。如果你不使用該函數在Web端有太多這樣的圖片產生任務,你可能會發現導致性能下降。
四.應用進階:1.修改輸出格式:
上面介紹了基礎設定,我們知道PHP支持多種圖像格式,如果你希望以JPEG格式輸出的話,可以修改步驟3將修改為:
Header (‘Content-type: image/jpeg’); ImageJPEG ($im);
然後存盤,重新啟動Apache web服務器。然後使用浏覽器。注意此時浏覽器上部輸出的格式,見圖4.
圖4 JPEG圖像格式輸出到浏覽器的界面
當然如果希望輸出的圖像到一個文件而不是浏覽器,可以通過修改函數完成:
ImageJPEG ($im,$filename);
這樣圖像會以JPEG格式輸出到filename文件。
2.從其他文件創建背景
上面介紹了通過調用$im = ImageCreateTrueColor()函數建立圖像標示符號。這裡介紹一種通過讀入一個已有的圖像文件,然後對圖像進行過濾,改變其大小或者在基礎上添加其他圖像。根據所讀入文件格式不同通常是:ImageCreateFromPNG(), ImageCreateFromJPEG(), 和ImageCreateFromGIF(),這三個函數都是以文件名為參數。除了直接以PNG、JPEG等圖像加入IMG標記,還可以在SRC屬性中使用可以能夠生成圖像的PHP腳本。例如:
<img src=“si1.php” height=“200” width=“200” alt=“PHP going ” />
上面腳本會調用si1.php然後在浏覽器中輸出文本:PHP going
3. 為PHP配置ImageMagick庫
ImageMagicK主要用於對圖像進行轉換、編輯、組合、特殊處理等,是另外一款非常好用的圖像處理工具。它支持對多種格式的圖像進行處理,最多支持的圖像格式有157種格式,包括目前流行的TIFF、JPEG、PNG、PDF、PhotoCD及GIF等。Image MagicK還支持動態圖像創建,這一點非常適合在Web頁面上使用。Image MagicK支持通過命令行方式對圖像進行處理。另外,它還提供編程接口,高級用戶可以通過C、C++、Perl、Java接口對圖像進行個性化處理。Image MagicK支持數百種的圖像處理,提供多種過濾功能。Image MagicK方便地支持圖像格式轉換,支持透明圖像、可制作多幀GIF圖像、進行圖像合並等。圖像操作包括縮放、旋轉、銳化、減色或特殊效果處理等。並且能夠以另一種圖象格式保存。ImageMagick庫並不是標准PHP的一部分,但是可以通過PHP擴展類庫(PECL 是通過 PEAR 打包系統來的 PHP 擴展庫倉庫,PECL官方網站:http://pecl.php.net/package/ )很容易安裝這個函數庫。和GD2相比ImageMagick庫功能更加豐富。特別是你如果希望創建GIF特別是動畫GIF,那麼推薦使用ImageMagick。ImageMagick官方網站:http://www.imagemagick.org 。下載安裝配置步驟如下:
#wget http://nchc.dl.sourceforge.net/sourceforge/imagemagick/ImageMagick-5.5.7-35.tar.bz2
#bunzip2 ImageMagick-5.5.7-35.tar.bz2
#tar xvf ImageMagick-k-5.5.7-35.tar#cd ImageMagick-5.5.7-35
#./configure LDFLAGS="-L/usr/lib" CPPFLAGS="-I/usr/include" \--prefix=/usr/local/ImageMagick --enable-shared \--enable-lzw # 打開lzw格式的壓縮#makemake install
wget wget http://pecl.php.net/get/imagick-0.9.11.tgz
mkdir ext/ imagick
tar zxvf imagick-0.9.11.tgz
phpize #phpize命令是用來准備 PHP 擴展庫的編譯環境的。#
cd PHP_SRC_DIR/ ext/magickwand # PHP_SRC_DIR是指你的php源碼目錄#
rm configure
./buildconf --force
說明:如果你的PHP的安裝不是在/usr下,你必須從你的安裝目錄下的bin/目錄調出phpize.比如,如果你已經在/usr/local/php下安裝了PHP,你就需要執行/usr/local/php/bin/phpize。可以使用命令:“which phpize ”查看位置,如果是通過rpm 包安裝的可以用這個命令查看:“rpm -qail grep phpize”。然後進行php的第二次編譯
./configure --prefix=/usr/local/php --with-mysql=/usr/local/mysql \
--with-imagick=/usr/local/ImageMagick
--with-apxs=/usr/local/apache/bin/apxs
make;make install
以上編譯結束後,重新啟動Apache後運行phpinfo()來檢查一下新的設置是否生效了。如果出現如下選項,見圖5.
圖5 為PHP加入ImageMagick庫
從圖5可以看到配置ImageMagick庫後可以處理的圖像格式增加到近150多種。ImageMagick 可以幫助PHP完成許多任務以滿足您的命令行圖像處理需求。可以大幅度地減輕工作負擔。也可以通過 C、C++、Perl、Python、Java 和其它幾種語言使用 ImageMagick,Linux 程序員會喜歡這樣做。另外最新ImageMagick網站的已經有了一個叫MagickWand for PHP的插件,也可以支持PHP。讀者可以自己測試。另外如果希望了解更多的PHP圖像操作技巧可以訪問:http://www.devshed.com,這裡有許多動態圖像的PHP腳本。
總結:本文分五個部分介紹了基於Linux平台下的PHP圖像操作技巧。本文所有腳本在Red Hat Enterprise Linux AS 4.0環境下測試通過,PHP版本4.3.9,GD庫2.08。
小資料:
PHP安裝GD庫後和圖像相關的函數包括:
GetImageSize: 取得圖片的長寬。 ImageArc: 畫弧線。 ImageChar: 寫出橫向字符。 ImageCharUp: 寫出直式字符。 ImageColorAllocate: 匹配顏色。 ImageColorTransparent: 指定透明背景色。 ImageCopyResized: 復制新圖並調整大小。 ImageCreate: 建立新圖。 ImageDashedLine: 繪虛線。 ImageDestroy: 結束圖形。 ImageFill: 圖形著色。 ImageFilledPolygon: 多邊形區域著色。 ImageFilledRectangle: 矩形區域著色。 ImageFillToBorder: 指定顏色區域內著色。 ImageFontHeight: 取得字型的高度。 ImageFontWidth: 取得字型的寬度。 ImageInterlace: 使用交錯式顯示與否。 ImageLine: 繪實線。 ImageLoadFont: 載入點陣字型。 ImagePolygon: 繪多邊形。 ImageRectangle: 繪矩形。 ImageSetPixel: 繪點。 ImageString: 繪橫式字符串。 ImageStringUp: 繪直式字符串。 ImageSX: 取得圖片的寬度。 ImageSY: 取得圖片的高度。 ImageTTFBBox: 計算 TTF 文字所占區域。 ImageTTFText: 寫 TTF 文字到圖中。 ImageColorAt: 取得圖中指定點顏色的索引值。 ImageColorClosest: 計算色表中與指定顏色最接近者。 ImageColorExact: 計算色表上指定顏色索引值。 ImageColorResolve: 計算色表上指定或最接近顏色的索引值。 ImageColorSet: 配置色表上指定索引的顏色。 ImageColorsForIndex: 取得色表上指定索引的顏色。 ImageColorsTotal: 計算圖的顏色數。 ImagePSLoadFont: 載入 PostScript 字型。 ImagePSFreeFont: 卸下 PostScript 字型。 ImagePSEncodeFont: PostScript 字型轉成向量字。 ImagePSText: 寫 PostScript 文字到圖中。 ImagePSBBox: 計算 PostScript 文字所占區域。 ImageCreateFromPNG: 取出 PNG 圖型。 ImagePNG: 建立 PNG 圖型。 ImageCreateFromGIF: 取出 GIF 圖型。 ImageGIF: 建立 GIF 圖型。