利用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(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格式的壓縮#
make
make 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 圖型。