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

來源:互聯網
上載者:User

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



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.