在PHP中,有一些簡單的映像函數是可以直接使用的,但大多數要處理的映像,都需要在編譯PHP時加上GD庫。除了安裝GD庫之外,在PHP中還可能需要其他的庫,這可以根據需要支援哪些映像格式而定。GD庫可以在http://www.boutell.com/gd/免費下載,不同的GD版本支援的映像格式不完全一樣,最新的GD庫版本支援GIF、JPEG、PNG、WBMP、XBM等格式的影像檔,此外還支援一些如FreeType、Type 1等字型庫。通過GD庫中的函數可以完成各種點、線、幾何圖形、文本及顏色的操作和處理,也可以建立或讀取多種格式的影像檔。
在PHP中,通過GD庫處理映像的操作,都是先在記憶體中處理,操作完成以後再以檔案流的方式,輸出到瀏覽器或儲存在伺服器的磁碟中。建立一個映像應該完成如下所示的4個基本步驟。
(1)建立畫布:所有的繪圖設計都需要在一個背景圖片上完成,而畫布實際上就是在記憶體中開闢的一塊臨時地區,用於儲存映像的資訊。以後的映像操作都將基於這個背景畫布,該畫布的管理就類似於我們在畫畫時使用的畫布。
(2)繪製映像:畫布建立完成以後,就可以通過這個畫布資源,使用各種畫像函數設定映像的顏色、填充畫布、畫點、線段、各種幾何圖形,以及向映像中添加文本等。
(3)輸出映像:完成整個映像的繪製以後,需要將映像以某種格式儲存到伺服器指定的檔案中,或將映像直接輸出到瀏覽器上顯示給使用者。但在映像輸出之前,一定要使用header()函數發送Content-type通知瀏覽器,這次發送的是圖片不是文本。
(4)釋放資源:映像被輸出以後,畫布中的內容也不再有用。出於節約系統資源的考慮,需要及時清除畫布佔用的所有記憶體資源。
php中用GD繪製折線圖,代碼如下:
Class Chart{ private $image; // 定義映像 private $title; // 定義標題 private $ydata; // 定義Y軸資料 private $xdata; // 定義X軸資料 private $seriesName; // 定義每個系列資料的名稱 private $color; // 定義橫條圖顏色 private $bgcolor; // 定義圖片背景顏色 private $width; // 定義圖片的寬 private $height; // 定義圖片的長 /* * 建構函式 * String title 圖片標題 * Array xdata 索引數組,X軸資料 * Array ydata 索引數組,數字數組,Y軸資料 * Array series_name 索引數組,資料數列名稱 */ function __construct($title,$xdata,$ydata,$seriesName) { $this->title = $title; $this->xdata = $xdata; $this->ydata = $ydata; $this->seriesName = $seriesName; $this->color = array('#DC', '#B', '#EDB', '#DDDF', '#CBE', '#E', '#FF', '#FFF', '#AFC'); } /* * 公有方法,設定橫條圖的顏色 * Array color 顏色數組,元素取值為'#DC'這種形式 */ function setBarColor($color){ $this->color = $color; } /* * 繪製折線圖 */ public function paintLineChart() { $ydataNum = $this->arrayNum($this->ydata); // 取得資料分組的個數 $max = $this->arrayMax($this->ydata); // 取得所有呈現資料的最大值 $max = ($max > )? $max : ; $multi = $max/; // 如果最大資料是大於的則進行縮小處理 $barHeightMulti = .; // 條形高縮放的比例 $lineWidth = ; $chartLeft = (+strlen($max))*; // 設定圖片左邊的margin $lineY = ; // 初始化橫條圖的Y的座標 // 設定圖片的寬、高 //$this->width = $lineWidth*count($this->xdata) + $chartLeft - $lineWidth/.; $margin = ; // 小矩形描述右邊margin $recWidth = ; // 小矩形的寬 $recHeight = ; // 小矩形的高 $space = ; // 小矩形與橫條圖的間距 $tmpWidth = ; // 設定圖片的寬、高 $lineChartWidth = $lineWidth*count($this->xdata) + $chartLeft - $lineWidth/. ; // 兩個系列資料以上的加上小矩形的寬 if($ydataNum > ) { $tmpWidth = $this->arrayLengthMax($this->seriesName)**/ + $space + $recWidth + + $margin; } $this->width = $lineChartWidth + $tmpWidth; $this->height = ; $this->image = imagecreatetruecolor($this->width ,$this->height); // 準備畫布 $this->bgcolor = imagecolorallocate($this->image,,,); // 圖片的背景顏色 // 設定橫條圖的顏色 $color = array(); foreach($this->color as $col) { $col = substr($col,,strlen($col)-); $red = hexdec(substr($col,,)); $green = hexdec(substr($col,,)); $blue = hexdec(substr($col,,)); $color[] = imagecolorallocate($this->image ,$red, $green, $blue); } // 設定線段的顏色、字型的顏色、字型的路徑 $lineColor = imagecolorallocate($this->image ,xcc,xcc,xcc); $fontColor = imagecolorallocate($this->image, x,xf,xf); $fontPath = 'font/simsun.ttc'; imagefill($this->image,,,$this->bgcolor); // 繪畫背景 // 繪畫圖的分短線與左右邊線 for($i = ; $i < ; $i++ ) { imageline($this->image,$chartLeft-,$lineY-$barHeightMulti*$max//$multi*$i,$lineChartWidth,$lineY-$barHeightMulti*$max//$multi*$i,$lineColor); imagestring($this->image,,,$lineY-$barHeightMulti*$max//$multi*$i-,floor($max/*$i),$fontColor); } imageline($this->image,$chartLeft-,,$chartLeft-,$lineY,$lineColor); imageline($this->image,$lineChartWidth-,,$lineChartWidth-,$lineY,$lineColor); $style = array($lineColor,$lineColor,$lineColor,$lineColor,$lineColor,$this->bgcolor,$this->bgcolor,$this->bgcolor,$this->bgcolor,$this->bgcolor); imagesetstyle($this->image,$style); // 繪製折線圖的分隔線(虛線) foreach($this->xdata as $key => $val) { $lineX = $chartLeft + + $lineWidth*$key; imageline($this->image,$lineX,,$lineX,$lineY,IMG_COLOR_STYLED); } // 繪畫圖的折線 foreach($this->ydata as $key => $val) { if($ydataNum == ) { // 一個系列資料時 if($key == count($this->ydata) - ) break; $lineX = $chartLeft + + $lineWidth*$key; $lineY = $lineY-$barHeightMulti*($this->ydata[$key+])/$multi; // 畫折線 if($key == count($this->ydata) - ) { imagefilledellipse($this->image,$lineX+$lineWidth,$lineY,,,$color[]); } imageline($this->image,$lineX,$lineY-$barHeightMulti*$val/$multi,$lineX+$lineWidth,$lineY,$color[]); imagefilledellipse($this->image,$lineX,$lineY-$barHeightMulti*$val/$multi,,,$color[]); }elseif($ydataNum > ) { // 多個系列的資料時 foreach($val as $ckey => $cval) { if($ckey == count($val) - ) break; $lineX = $chartLeft + + $lineWidth*$ckey; $lineY = $lineY-$barHeightMulti*($val[$ckey+])/$multi; // 畫折線 if($ckey == count($val) - ) { imagefilledellipse($this->image,$lineX+$lineWidth,$lineY,,,$color[$key%count($this->color)]); } imageline($this->image,$lineX,$lineY-$barHeightMulti*$cval/$multi,$lineX+$lineWidth,$lineY,$color[$key%count($this->color)]); imagefilledellipse($this->image,$lineX,$lineY-$barHeightMulti*$cval/$multi,,,$color[$key%count($this->color)]); } } } // 繪畫橫條圖的x座標的值 foreach($this->xdata as $key => $val) { $lineX = $chartLeft + $lineWidth*$key + $lineWidth/ - ; imagettftext($this->image,,-,$lineX,$lineY+,$fontColor,$fontPath,$this->xdata[$key]); } // 兩個系列資料以上時繪製小矩形及之後文字說明 if($ydataNum > ) { $x = $lineChartWidth + $space; $y = ; foreach($this->seriesName as $key => $val) { imagefilledrectangle($this->image,$x,$y,$x+$recWidth,$y+$recHeight,$color[$key%count($this->color)]); imagettftext($this->image,,,$x+$recWidth+,$y+$recHeight-,$fontColor,$fontPath,$this->seriesName[$key]); $y += $recHeight + ; } } // 繪畫標題 $titleStart = ($this->width - .*strlen($this->title))/; imagettftext($this->image,,,$titleStart,,$fontColor,$fontPath,$this->title); // 輸出圖片 header("Content-Type:image/png"); imagepng ( $this->image ); } /* * 私人方法,當數組為二元數組時,統計數組的長度 * Array arr 要做統計的數組 */ private function arrayNum($arr) { $num = ; if(is_array($arr)) { $num++; for($i = ; $i < count($arr); $i++){ if(is_array($arr[$i])) { $num = count($arr); break; } } } return $num; } /* * 私人方法,計算數組的深度 * Array arr 數組 */ private function arrayDepth($arr) { $num = ; if(is_array($arr)) { $num++; for($i = ; $i < count($arr); $i++){ if(is_array($arr[$i])) { $num += $this->arrayDepth($arr[$i]); break; } } } return $num; } /* * 私人方法,找到一組中的最大值 * Array arr 數字數組 */ private function arrayMax($arr) { $depth = $this->arrayDepth($arr); $max = ; if($depth == ) { rsort($arr); $max = $arr[]; }elseif($depth > ) { foreach($arr as $val) { if(is_array($val)) { if($this->arrayMax($val) > $max) { $max = $this->arrayMax($val); } }else{ if($val > $max){ $max = $val; } } } } return $max; } /* * 私人方法,求數組的平均值 * Array arr 數字數組 */ function arrayAver($arr) { $aver = array(); foreach($arr as $val) { if(is_array($val)) { $aver = array_merge($aver,$val); }else{ $aver[] = $val; } } return array_sum($aver)/count($aver); } /* * 私人方法,求數組中元素長度最大的值 * Array arr 字串數組,必須是漢字 */ private function arrayLengthMax($arr) { $length = ; foreach($arr as $val) { $length = strlen($val) > $length ? strlen($val) : $length; } return $length/; } // 解構函式 function __destruct(){ imagedestroy($this->image); } }
測試代碼如下:
$xdata = array('測試一','測試二','測試三','測試四','測試五','測試六','測試七','測試八','測試九'); $ydata = array(array(,,,,,,,,),array(,,,,,,,,)); $color = array(); $seriesName = array("七月","八月"); $title = "測試資料"; $Img = new Chart($title,$xdata,$ydata,$seriesName); $Img->paintLineChart();
效果圖如下:
到此代碼結束。
下面給大家介紹php中GD庫的一些簡單使用
今天瞭解了一些GD庫的簡單使用,現在稍微做一下總結!
GD庫是什嗎?,graphic device,映像工具庫,gd庫是php處理圖形的擴充庫,gd庫提供了一系列用來處理圖片的API,使用GD庫可以處理圖片,或者產生圖片。 在網站上 GD庫通常用來產生縮圖或者用來對圖片加浮水印或者對網站資料產生報表。
php並不局限於輸出HTML文本。php通過使用GD擴充庫還能用來動態輸出映像,例如文字按鈕、驗證碼、資料統計圖等。哈可以輕鬆地編輯映像,力圖處理縮圖和為圖片添加浮水印等,具有強大的影像處理能力。
首先我們來說下GD庫,繪製個簡單圖形的一些步驟:
1、首先是建立畫布,此處我們利用imagecreatetruecolor函數,也可以利用imagecreate,區別在於前者建立了一個真彩映像,後者建立了一個基於調色盤的映像
$img=imagecreatetruecolor(100,100),其中有兩個參數分別對應,我們建立的映像的寬和高
2、設定一些必要的"染料盒"
其實就是定義一些之後會用到的填充顏色,此處我們統一定義在這個位置,此處我們利用imagecolorallocate函數
$white=imagecolorallocate($img,0xFF,0xFF,0xFF)或者可以使用RGB的顏色命名方式 如$white=imagecolorallocate($img,255,255,255);$gray = imagecolorallocate($img, 0xC0, 0xC0, 0xC0);$darkgray = imagecolorallocate($img, 0x90, 0x90, 0x90);$navy = imagecolorallocate($img, 0x00, 0x00, 0x80);$darknavy = imagecolorallocate($img, 0x00, 0x00, 0x50);$red = imagecolorallocate($img, 0xFF, 0x00, 0x00);$darkred = imagecolorallocate($img, 0x90, 0x00, 0x00);$black=imagecolorallocate($img,0x00,0x00,0x00);
此處我們定義多一些所需要的顏色
3、填充地區顏色,可以簡單的理解為填充圖片的背景顏色,利用imagefill函數
imagefill($img,0,0,$white),此處的0 0表示從座標x y處開始填充背景色
4、繪製圖形,例如繪製餅狀圖,所需要的是imagefilledarc函數
imagefilledarc()的參數相對來說較多,形如imagefilledarc($img,50,$i,100,50,0,45,$red,IMG_ARC_PIE);
其中分別表示以red顏色字img映像上繪製一個以50,$i為起點,以0 45角度這個範圍內繪製弧線
5、期間我們還可以添加一些說明問題,比如水平的添加一個字串,利用 imagestring($img,1,20,40,"hello,world!",$red),表示在img圖片中以20 40為座標,寫上一個紅色的hello,world!字樣
6、就是講映像輸出
首先要告之瀏覽器要以何種圖片格式輸出,例如以png輸出,則使用header("Content-type:image/png");
其次 將圖片輸出到瀏覽器中,imagepng($img);
最後,銷毀圖片,即釋放該圖片儲存所佔用的記憶體 imagedestroy(img);,