程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 用PHP創建動態圖形

用PHP創建動態圖形

編輯:關於PHP編程

PHP有一個令人驚訝的能力——你可以利用它的服務器端腳本創建動態圖形。這項功能的基礎是GD庫,它是由Thomas Boutell設計的ANSI C庫,這個庫支持除.GIF文件之外的絕大多數常見圖形文件格式(不過該庫的設計者許諾當LZW專利在2004年7月7日到期後就立即添加.GIF支持)。
PHP4.3以及它的更高版本集成了GD庫。如果你使用的是老版本的PHP,你需要手工安裝圖形支持。這兒有許多與之有關的信息。
折線圖
為了演示如何用PHP創建動態圖形,我們建立一些自定義圖形。第一個例子是畫在網格上的折線圖,如圖A所示。
圖A
500) this.width=500' align='center' hspace='10' vspace='10'>
我們把這個頁面叫著grid.php(相關附件:清單A)。為了調用Web頁動態產生的圖形,你只需要訪問這個PHP頁,它將該圖形傳遞到浏覽器。IMG元素可以很好的完成這項工作。下面是實現這個功能的例子代碼:

現在,我們開始編寫用於創建圖形的代碼。下面是grid.php中源代碼片斷:
//添加圖形的值
$graphValues=array(0,80,23,11,190,245,50,80,111,240,55);
首先,我們定義圖形的值。在這個例子中,圖形值直接寫到代碼中的一個數組中,不過你可以很容易改寫代碼,讓代碼從XML文件、表格或者數據庫中獲取這些值。這些值的范圍從0到250(以象素為單位的圖形尺寸)。這些值將決定每個網格上線段的初始象素位置。如果你想使用數值0和100(用百分比表示),你只需把這些值乘以2.5來決定網格上的象素位置。
然後,我們發送一個PNG頭並定義圖像的高度和寬度:
// Define .PNG image
header("Content-type: image/png");
$imgWidth=250;
$imgHeight=250;
我們發送一個圖形頭來“欺騙”浏覽器,使它認為我們的PHP頁面是一幅真正的圖像,這樣它才可以正確顯示在屏幕上。服務器將以二進制數據流的形式把程序產生的信息發送到浏覽器。
PNG(Portable Network Graphic,便攜式網路圖形)標准是一種無損的圖形格式,它由於GIF的 LZW算法專利這一法律問題而在1995年提出來的。
現在,我們例化圖形對象並定義我們在圖形中用到的顏色:
//創建圖像、定義顏色
$image=imagecreate($imgWidth, $imgHeight);
$colorWhite=imagecolorallocate($image, 255, 255, 255);
$colorGrey=imagecolorallocate($image, 192, 192, 192);
$colorBlue=imagecolorallocate($image, 0, 0, 255);
我們設置白色背景,灰色畫框以及藍色折線。你可以通過創建新變量並賦不同的RGB值來輕松的修改或者添加顏色。
我們可以用imageline函數來創建灰色畫框,每次調用這個函數就畫一條線:
//創建圖像周圍的框
imageline($image, 0, 0, 0, 250, $colorGrey);
imageline($image, 0, 0, 250, 0, $colorGrey);
imageline($image, 249, 0, 249, 249, $colorGrey);
imageline($image, 0, 249, 249, 249, $colorGrey);
這裡用到了二維的x/y象素坐標。Imageline函數中的每一對值指定了圖像的起點和終點。
為了實現網格線,我們在x坐標軸和y坐標軸上每隔25個象素畫一條灰線:
//創建網格
for ($i=1; $i<11; $i++){
imageline($image, $i*25, 0, $i*25, 250, $colorGrey);
imageline($image, 0, $i*25, 250, $i*25, $colorGrey);
}
位置(0,0)表示網格的左上角,位置(250,250)表示右下角。每個坐標軸等分為10格,每格寬度是25個象素,即250個象素(圖形的尺寸)。
為了創建折線圖,我們只需循環的取出數組中的坐標值,按坐標畫出每條線段的起點和終點:
//創建折線圖
for ($i=0; $i<10; $i++){
imageline($image, $i*25, (250-$graphValues[$i]), ($i+1)*25, (250-$graphValues[$i+1]), $colorBlue);
}
PHP將會自動在起點和終點之間填充藍線。在這個簡單的例子中只有10個值,但是擴展這個技術非常容易,如創建類似股指示意圖那樣的復雜圖形等等。
最後,我們需要把這個圖像輸出到浏覽器並清空服務器中保存圖像的內存空間:
//輸出圖形並清楚內存中的圖像
imagepng($image);
imagedestroy($image);
?>
直方圖
把上面用於創建折線圖的基本程序修改後用於創建直方圖(如圖B所示)。
圖B
500) this.width=500' align='center' hspace='10' vspace='10'>
(相關附件:清單B)這段程序與我們上面用來畫折線圖的代碼略有不同。Imagefilledrectangle函數創建兩種直方塊——深色的直方塊表示$graphValues數組中保存的值,而淺色直方塊則用於填充深色方塊之間的空隙:
//創建直方圖
for ($i=0; $i<10; $i++){
imagefilledrectangle($image, $i*25, (250-$graphValues[$i]), ($i+1)*25, 250, $colorDarkBlue);
imagefilledrectangle($image, ($i*25)+1, (250-$graphValues[$i])+1, (($i+1)*25)-5, 248, $colorLightBlue);
}
留心CPU的負荷
當你在服務器端創建這些圖形時,你需要仔細考慮這個問題:CPU負荷。如果你在Web端有太多這樣的動態圖片產生任務,你可能會發現導致性能下降。
更復雜的用法
本文所列舉的例子僅僅是個起點。如果你想得到有關PHP圖形庫的更多信息,請查看PHP手冊上的的圖形函數網頁。
英文版地址:

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved