利用php創(chuàng)建圖像是相當(dāng)容易的一件事情。只要安裝一些第三方的庫(kù)文件并具有一定的幾何知識(shí),就可以利用php來(lái)創(chuàng)建和處理圖像了。目前php使用gd庫(kù)處理圖像。在php中一些圖像函數(shù)是可以直接使用的,但是大多數(shù)函數(shù)需要安裝gd函數(shù)庫(kù)。gd庫(kù)提供一系列函數(shù)進(jìn)行畫(huà)圖、使用顏色、處理預(yù)存的圖像和填充操作。gd庫(kù)是thomas boutell設(shè)計(jì)的ansi c語(yǔ)言編寫(xiě),同時(shí)支持在perl、tcl語(yǔ)言中作圖。由于gd是一個(gè)可以被建立成共享或靜態(tài)的庫(kù),所以在php使用gd庫(kù)進(jìn)行圖像操作是非常容易的。gd圖像庫(kù)工作原理見(jiàn)圖1。
圖1 php圖像調(diào)用原理
gd庫(kù)目前由boutell公司維護(hù),官方網(wǎng)址是:http://www.boutell.com/gd/ ,本文寫(xiě)作時(shí)的最新版本是:2004年11月03日4發(fā)布的gd 2.0.33。
一. php支持的圖像格式和字體
gd庫(kù)版本php支持以下圖像格式和字體:
1.png
png(portable network graphics)是一種能存儲(chǔ)32位信息的位圖文件格式,其圖像質(zhì)量遠(yuǎn)勝過(guò)gif。同gif一樣,png也使用無(wú)損壓縮方式來(lái)減少文件的大小。在壓縮位圖數(shù)據(jù)時(shí),它采用了頗受好評(píng)的l z77算法的一個(gè)變種。目前,越來(lái)越多的軟件開(kāi)始支持這一格式,在不久的將來(lái),它可能會(huì)在整個(gè)web上廣泛流行。png圖像可以是灰階的(16位)或彩色的(48位),也可以是8位的索引色。png圖像使用的是高速交替顯示方案,顯示速度很快,只需要下載1/64的圖像信息就可以顯示出低分辨率的預(yù)覽圖像。與gif不同的是,png圖像格式不支持動(dòng)畫(huà)。png是php支持的確省圖像格式。
2.jpeg
jpeg(joint photographic expert group)是24位的圖像文件格式,也是一種高效率的壓縮格式,文件格式是jpeg(聯(lián)合圖像專家組)標(biāo)準(zhǔn)的產(chǎn)物,該標(biāo)準(zhǔn)由iso與ccitt(國(guó)際電報(bào)電話咨詢委員會(huì))共同制定,是面向連續(xù)色調(diào)靜止圖像的一種壓縮標(biāo)準(zhǔn)。其最初目的是使用64kbps的通信線路傳輸720×576分辨率壓縮后的圖像。通過(guò)損失極少的分辨率,可以將圖像所需存儲(chǔ)量減少至原大小的10%。由于其高效的壓縮效率和標(biāo)準(zhǔn)化要求,目前已廣泛用于彩色傳真、靜止圖像、電話會(huì)議、印刷及新聞圖片的傳送上。但那些被刪除的資料無(wú)法在解壓時(shí)還原,所以jpeg文件并不適合放大觀看,輸出成印刷品時(shí)品質(zhì)也會(huì)受到影響。一般情況下,jpeg文件只有幾十kb,而色彩數(shù)最高可達(dá)到24位,所以它被廣泛運(yùn)用在互聯(lián)網(wǎng)上,以節(jié)約寶貴的網(wǎng)絡(luò)傳輸資源。
3.wbmp
wbmp (wireless bitmap)即無(wú)線位圖是專為行動(dòng)通訊裝置如行動(dòng)電話和 pda 等設(shè)計(jì)的圖像格式。這種格式用于無(wú)線通訊協(xié)議 (wap) 網(wǎng)頁(yè)。wbmp 是 1 位的格式,因此只有兩種顏色是可見(jiàn)的:黑色和白色。
4.xbm
xbm(x bitmap)是一種圖形文件格式。是一種古老但通用的圖像文件格式,它與現(xiàn)在的許多web瀏覽器都兼容。x-windows圖形界面(unix和linux常用的gui)的c代碼庫(kù)xlib中有一個(gè)組件專門(mén)描述了它的規(guī)范。xbm格式本來(lái)是為存儲(chǔ)單色的系統(tǒng)位圖而設(shè)計(jì)的,比如圖標(biāo)和鼠標(biāo)指針。xbm圖形的實(shí)質(zhì)上是使用16進(jìn)制數(shù)組來(lái)表示二進(jìn)制圖像的c源代碼文件。x-bitmaps是生成簡(jiǎn)單web圖形的一個(gè)有意思的選擇,它不需要其它的東西,只要有瀏覽器就可以工作。
5.gif
gif(graphics interchange format)是在各種平臺(tái)的各種圖形處理軟件上均能夠處理的、經(jīng)過(guò)壓縮的一種圖形文件格式。gif文件的數(shù)據(jù)是基于lzw算法的連續(xù)色調(diào)的無(wú)損壓縮格式。其壓縮率一般在50%左右,它不屬于任何應(yīng)用程序。目前幾乎所有相關(guān)軟件都支持它,公共領(lǐng)域有大量的軟件在使用gif圖像文件。由于unisys公司專利原因(gif 格式使用的 lzw 演算法牽涉到 unisys 的專利權(quán))php一度它不支持gif格式。如果你非常喜歡這種格式,可以在http://www.linuxguruz.org/downloads/gd1.3.tar.gz 下載這個(gè)早期版本不過(guò)并不推薦使用。有關(guān)gif格式專利問(wèn)題的更多信息請(qǐng)看網(wǎng)頁(yè): http://lpf.ai.mit.edu/patents/gif/gif.html 。
6. truetype 字體
truetype就是打印和屏幕都適用的可縮放字體。最先由apple公司開(kāi)發(fā),是目前計(jì)算機(jī)上的主要字體類(lèi)型。位圖字體僅能以它們的單個(gè)固定大小來(lái)顯示比例,truetype字體會(huì)以三種不同的大小來(lái)顯示比例。
7. postscript字體
postscript最先由adobe公司開(kāi)發(fā),是一種頁(yè)面描述語(yǔ)言,用來(lái)描述圖形和文本輸出(通常是至 postscript 打印機(jī))的位置和外觀。postscript 打印機(jī)可打開(kāi)由任何類(lèi)型的字體所創(chuàng)建的文本,但為最大程度上利用 postscript 的性能,用戶需要專用的 postscript 字體。postscript 字體通常稱為打印機(jī)字體。
二、為php配置圖像和字體庫(kù)
從php4.3開(kāi)始,php捆綁了自己版本的gd2庫(kù)。在windows平臺(tái)gd2庫(kù)自動(dòng)支持png、jpeg格式。如果希望在unix、bsd、linux平臺(tái)使用png格式則需要安裝二個(gè)動(dòng)態(tài)鏈接函數(shù)庫(kù)libpng和zlib。可以飽含在linux發(fā)行版本的rpm包或者其官方網(wǎng)址下載源代碼編譯。
zlib庫(kù):http://www.gzip.org/zlib/
編譯時(shí)注意使用如下命令行選項(xiàng):
./configure --with-zlib-dir=/path/to/zlib
libpng庫(kù):http://www.libpng.org/pub/png/
編譯時(shí)注意使用如下命令行選項(xiàng):
./configure --with-png-dir=/path/to/libpng
如果希望在unix、bsd、linux平臺(tái)使用jpeg需要安裝jpeg-6d庫(kù)然后重新編譯gd庫(kù)。可以在其官方網(wǎng)址下載源代碼編譯。
jpeg-6d庫(kù):ftp://ftp.uu.net/graphics/jpeg/
編譯時(shí)注意使用如下命令行選項(xiàng):
./configure --with-jpeg-dir=/path/to/jpeg-6b
如果希望在unix、bsd、linux平臺(tái)使用truetype 字體需要安裝truetype 庫(kù)。可以在其官方網(wǎng)址下載源代碼編譯。
truetype庫(kù):http://www.freetype.org/
如果希望在unix、bsd、linux平臺(tái)使用postscript type 1字體需要安裝t1lib庫(kù)。可以在其官方網(wǎng)址下載源代碼編譯。
postscript type 1庫(kù):ftp://sunsite.unc.edu/pub/linux/libs/graphics/
編譯時(shí)注意使用如下命令行選項(xiàng):
./configure --with-t1lib[=path/to/t1lib]
以上所有庫(kù)編譯結(jié)束后,重新啟動(dòng)apache服務(wù)器后運(yùn)行phpinfo()來(lái)檢查一下新的設(shè)置是否生效了。如果出現(xiàn)如下選項(xiàng),見(jiàn)圖2.
圖2 gd庫(kù)配置界面
從圖2可以看到為php配置圖像和字體已經(jīng)完成。現(xiàn)在,我們就可以開(kāi)始圖像創(chuàng)建工作了。
三、創(chuàng)建圖像步驟
在php中創(chuàng)建一個(gè)圖像通常需要以下四個(gè)步驟:
1. 創(chuàng)建一個(gè)背景圖像,以后所以操作但是基于此背景。
2. 在圖像上繪圖輪廓或或者輸入文本。
3. 輸出最終圖形。
4. 清除內(nèi)存中所有資源。
下面我們看一個(gè)應(yīng)用實(shí)例,一個(gè)帶“php”標(biāo)簽的正方型。腳本如下:
<?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,然后用瀏覽器對(duì)它進(jìn)行訪問(wèn),就可以看到一個(gè)300×300像素大小的png格式的圖像,見(jiàn)圖3。
圖3 png圖像格式輸出到瀏覽器的界面
下面我們?cè)敿?xì)講解創(chuàng)建圖像過(guò)程:
1. 創(chuàng)建一個(gè)背景圖
要在php中建立或者修改一個(gè)圖像,必須首先建立一個(gè)圖像標(biāo)示符號(hào)。這里提供調(diào)用函數(shù):來(lái)實(shí)現(xiàn),如下所示:
$im = imagecreatetruecolor($width, $height)
然后為這個(gè)函數(shù)傳遞兩個(gè)參數(shù):第一個(gè)是新圖像寬度,第二個(gè)是新圖像高度。該函數(shù)將返回新圖像的標(biāo)示符號(hào)。
2. 在圖像上繪圖、打印文本
在一個(gè)圖像上繪圖和打印文本需要兩個(gè)步驟:1.首先選擇顏色。這里通過(guò)調(diào)用函數(shù)$im = imagecreatetruecolor()為圖像選擇顏色。顏色由紅、綠、藍(lán)(rgb)值的組合決定。這里使用了兩種顏色:
$white = imagecolorallocate ($im, 255, 255, 255);
$blue = imagecolorallocate ($im, 0, 0, 64);
然后需要使用其他函數(shù)將顏色繪制到圖像中。這些函數(shù)的選擇取決于要繪制的內(nèi)容:直線、弧形、多邊行或者文本。上面的腳本si1.php,一共使用了三個(gè)函數(shù):
imagefill($im, 0, 0, $blue);
這個(gè)函數(shù)以圖像標(biāo)示符號(hào)、繪圖區(qū)域的起始坐標(biāo)(x和y)以及顏色為參數(shù)。{注意php中圖像的起始坐標(biāo)從左上角開(kāi)始,該點(diǎn)坐標(biāo)為x=0,y=0.圖像右下角的坐標(biāo)x=$width ,y=$height。這于常規(guī)作圖習(xí)慣是相反的。}
imageline($im, 0, 0, $width, $height, $white);
這個(gè)函數(shù)以圖像標(biāo)示符號(hào)、直線的起始點(diǎn)的x和y坐標(biāo)以及顏色為參數(shù)。這樣就從左上角(0,0)開(kāi)始劃一條直線到圖像右下角($width, $height)。
最后我們?cè)谠搱D像中添加一共標(biāo)簽:
imagestring($im, 4, 50, 150, ‘php’, $white);
這個(gè)函數(shù)以圖像標(biāo)示符號(hào)、字體、文本的起始坐標(biāo)(x和y)以及顏色為參數(shù)。字體參數(shù)值范圍從1-5之間的數(shù)字。這里選擇的是truetype字體。
3.輸出最終圖形
可以將圖像輸出到瀏覽器或者一共文件。上面的例子中直接輸出到瀏覽器。包括兩個(gè)部分:.
a.首先告訴web瀏覽器我們輸出的是一個(gè)圖像而不是文本或者h(yuǎn)tml。
我們發(fā)送一個(gè)圖形頭來(lái)“欺騙”瀏覽器,使它認(rèn)為我們的php頁(yè)面是一幅真正的圖像,這樣它才可以正確顯示在屏幕上。服務(wù)器將以二進(jìn)制數(shù)據(jù)流的形式把程序產(chǎn)生的信息發(fā)送到瀏覽器。這里使用函數(shù)指定圖像的mime類(lèi)型來(lái)完成:
header (‘content-type: image/png’);
通常在使用瀏覽器接受一共文件時(shí)候,apache web服務(wù)器首先發(fā)送的內(nèi)容是mime類(lèi)型。對(duì)于php頁(yè)面是:
content-type: text/html
b.發(fā)送標(biāo)題數(shù)據(jù)后,下面使用如下函數(shù)輸出圖像數(shù)據(jù)。
imagepng ($im);
該函數(shù)以png格式將輸出內(nèi)容發(fā)送到瀏覽器。
c. 清除資源
當(dāng)完成對(duì)一共圖像的處理后,應(yīng)當(dāng)使用銷(xiāo)毀圖像標(biāo)示符號(hào),然后將所占用的選題資源返回給web服務(wù)器。這里調(diào)用函數(shù)imagedestroy()完成:
imagedestroy():
imagedestroy($im);
這樣作是為了降低cpu負(fù)荷。如果你不使用該函數(shù)在web端有太多這樣的圖片產(chǎn)生任務(wù),你可能會(huì)發(fā)現(xiàn)導(dǎo)致性能下降。
四.應(yīng)用進(jìn)階:
1.修改輸出格式:
上面介紹了基礎(chǔ)設(shè)定,我們知道php支持多種圖像格式,如果你希望以jpeg格式輸出的話,可以修改步驟3將修改為:
header (‘content-type: image/jpeg’);
imagejpeg ($im);
然后存盤(pán),重新啟動(dòng)apache web服務(wù)器。然后使用瀏覽器。注意此時(shí)瀏覽器上部輸出的格式,見(jiàn)圖4.
圖4 jpeg圖像格式輸出到瀏覽器的界面
當(dāng)然如果希望輸出的圖像到一個(gè)文件而不是瀏覽器,可以通過(guò)修改函數(shù)完成:
imagejpeg ($im,$filename);
這樣圖像會(huì)以jpeg格式輸出到filename文件。
2.從其他文件創(chuàng)建背景
上面介紹了通過(guò)調(diào)用$im = imagecreatetruecolor()函數(shù)建立圖像標(biāo)示符號(hào)。這里介紹一種通過(guò)讀入一個(gè)已有的圖像文件,然后對(duì)圖像進(jìn)行過(guò)濾,改變其大小或者在基礎(chǔ)上添加其他圖像。根據(jù)所讀入文件格式不同通常是:imagecreatefrompng(), imagecreatefromjpeg(), 和imagecreatefromgif(),這三個(gè)函數(shù)都是以文件名為參數(shù)。除了直接以png、jpeg等圖像加入img標(biāo)記,還可以在src屬性中使用可以能夠生成圖像的php腳本。例如:
<img src=“si1.php” height=“200” width=“200” alt=“php going ” />
上面腳本會(huì)調(diào)用si1.php然后在瀏覽器中輸出文本:php going
3. 為php配置imagemagick庫(kù)
imagemagick主要用于對(duì)圖像進(jìn)行轉(zhuǎn)換、編輯、組合、特殊處理等,是另外一款非常好用的圖像處理工具。它支持對(duì)多種格式的圖像進(jìn)行處理,最多支持的圖像格式有157種格式,包括目前流行的tiff、jpeg、png、pdf、photocd及gif等。image magick還支持動(dòng)態(tài)圖像創(chuàng)建,這一點(diǎn)非常適合在web頁(yè)面上使用。image magick支持通過(guò)命令行方式對(duì)圖像進(jìn)行處理。另外,它還提供編程接口,高級(jí)用戶可以通過(guò)c、c++、perl、java接口對(duì)圖像進(jìn)行個(gè)性化處理。image magick支持?jǐn)?shù)百種的圖像處理,提供多種過(guò)濾功能。image magick方便地支持圖像格式轉(zhuǎn)換,支持透明圖像、可制作多幀gif圖像、進(jìn)行圖像合并等。圖像操作包括縮放、旋轉(zhuǎn)、銳化、減色或特殊效果處理等。并且能夠以另一種圖象格式保存。imagemagick庫(kù)并不是標(biāo)準(zhǔn)php的一部分,但是可以通過(guò)php擴(kuò)展類(lèi)庫(kù)(pecl 是通過(guò) pear 打包系統(tǒng)來(lái)的 php 擴(kuò)展庫(kù)倉(cāng)庫(kù),pecl官方網(wǎng)站:http://pecl.php.net/package/ )很容易安裝這個(gè)函數(shù)庫(kù)。和gd2相比imagemagick庫(kù)功能更加豐富。特別是你如果希望創(chuàng)建gif特別是動(dòng)畫(huà)gif,那么推薦使用imagemagick。imagemagick官方網(wǎng)站: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 # 打開(kāi)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命令是用來(lái)準(zhǔn)備 php 擴(kuò)展庫(kù)的編譯環(huán)境的。#
cd php_src_dir/ ext/magickwand # php_src_dir是指你的php源碼目錄#
rm configure
./buildconf --force
然后進(jìn)行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
以上編譯結(jié)束后,重新啟動(dòng)apache后運(yùn)行phpinfo()來(lái)檢查一下新的設(shè)置是否生效了。如果出現(xiàn)如下選項(xiàng),見(jiàn)圖5.
圖5 為php加入imagemagick庫(kù)
從圖5可以看到配置imagemagick庫(kù)后可以處理的圖像格式增加到近150多種。imagemagick 可以幫助php完成許多任務(wù)以滿足您的命令行圖像處理需求。可以大幅度地減輕工作負(fù)擔(dān)。也可以通過(guò) c、c++、perl、python、java 和其它幾種語(yǔ)言使用 imagemagick,linux 程序員會(huì)喜歡這樣做。另外最新imagemagick網(wǎng)站的已經(jīng)有了一個(gè)叫magickwand for php的插件,也可以支持php。讀者可以自己測(cè)試。另外如果希望了解更多的php圖像操作技巧可以訪問(wèn):http://www.devshed.com,這里有許多動(dòng)態(tài)圖像的php腳本。
總結(jié):本文分五個(gè)部分介紹了基于linux平臺(tái)下的php圖像操作技巧。本文所有腳本在red hat enterprise linux as 4.0環(huán)境下測(cè)試通過(guò),php版本4.3.9,gd庫(kù)2.08。
小資料:
php安裝gd庫(kù)后和圖像相關(guān)的函數(shù)包括:
getimagesize: 取得圖片的長(zhǎng)寬。
imagearc: 畫(huà)弧線。
imagechar: 寫(xiě)出橫向字符。
imagecharup: 寫(xiě)出直式字符。
imagecolorallocate: 匹配顏色。
imagecolortransparent: 指定透明背景色。
imagecopyresized: 復(fù)制新圖并調(diào)整大小。
imagecreate: 建立新圖。
imagedashedline: 繪虛線。
imagedestroy: 結(jié)束圖形。
imagefill: 圖形著色。
imagefilledpolygon: 多邊形區(qū)域著色。
imagefilledrectangle: 矩形區(qū)域著色。
imagefilltoborder: 指定顏色區(qū)域內(nèi)著色。
imagefontheight: 取得字型的高度。
imagefontwidth: 取得字型的寬度。
imageinterlace: 使用交錯(cuò)式顯示與否。
imageline: 繪實(shí)線。
imageloadfont: 載入點(diǎn)陣字型。
imagepolygon: 繪多邊形。
imagerectangle: 繪矩形。
imagesetpixel: 繪點(diǎn)。
imagestring: 繪橫式字符串。
imagestringup: 繪直式字符串。
imagesx: 取得圖片的寬度。
imagesy: 取得圖片的高度。
imagettfbbox: 計(jì)算 ttf 文字所占區(qū)域。
imagettftext: 寫(xiě) ttf 文字到圖中。
imagecolorat: 取得圖中指定點(diǎn)顏色的索引值。
imagecolorclosest: 計(jì)算色表中與指定顏色最接近者。
imagecolorexact: 計(jì)算色表上指定顏色索引值。
imagecolorresolve: 計(jì)算色表上指定或最接近顏色的索引值。
imagecolorset: 配置色表上指定索引的顏色。
imagecolorsforindex: 取得色表上指定索引的顏色。
imagecolorstotal: 計(jì)算圖的顏色數(shù)。
imagepsloadfont: 載入 postscript 字型。
imagepsfreefont: 卸下 postscript 字型。
imagepsencodefont: postscript 字型轉(zhuǎn)成向量字。
imagepstext: 寫(xiě) postscript 文字到圖中。
imagepsbbox: 計(jì)算 postscript 文字所占區(qū)域。
imagecreatefrompng: 取出 png 圖型。
imagepng: 建立 png 圖型。
imagecreatefromgif: 取出 gif 圖型。
imagegif: 建立 gif 圖型。
|
新聞熱點(diǎn)
疑難解答
圖片精選