歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux綜合 >> Linux資訊 >> 更多Linux

Linux環境下如何使用PHP處理圖像

  利用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 圖型。




Copyright © Linux教程網 All Rights Reserved