在PHP中繪製映像的函數非常豐富,包括點、線、各種幾何圖形等可以想象出來的平面圖形,都可以通過PHP中提供的各種畫圖函數完成。我們在這裡介紹一些常用的映像繪製,如果使用我們沒有介紹過的函數,可以參考手冊實現。另外,這些圖形繪製函數都需要使用畫布資源,並在畫布中的位置通過座標(原點是在畫布左上方的起始位置,以像素為單位,沿著X軸正方向向右延伸,Y軸正方向向下延伸)決定,並且還可以通過函數的最後一個參數,設定每個圖形的顏色。畫布中的座標系統如圖所示。
1.函數繪圖區域填充imageFill()
通過PHP僅僅繪製出只有邊線的幾何圖形是不夠的,還可以使用對應的填充函數,完成繪圖區域的填充。除了每個圖形都有對應的填充函數之外,還可以使用imageFill()函數實現地區填充。該函數的文法格式如下:
bool imagefill(resource $image,int $x ,int $y,int $color) //地區填充
該函數在參數$image代表的映像上,相對於映像左上方(0,0)座標處,從座標($x,$y)處用參數$color指定的顏色執列區域填充。與座標($x,$y)點顏色相同且相鄰的點都會被填充。例如在下面的樣本中,將畫布的背景設定為紅色。代碼如下所示:
| 代碼如下 |
複製代碼 |
<?php
$im = imagecreatetruecolor(100, 100); //建立100*100大小的畫布
$red = imagecolorallocate($im, 255, 0, 0); //設定一個顏色變數為紅色
imagefill($im, 0, 0, $red); //將背景設為紅色
header('Content-type:image/png'); //通知瀏覽器這不是文本而是一個圖片
imagepng($im); //產生PNG格式的圖片輸出給瀏覽器
imagedestroy($im); //銷毀映像資源,釋放畫布佔用的記憶體空間
?>
|
2.繪製點和線imageSetPixel()、imageline()
畫點和線是繪製映像中最基本的操作,如果靈活使用,可以通過它們繪製出千變萬化的映像。在PHP中,使用imageSetPixel()函數在畫布中繪製一個單一像素的點,並且可以設定點的顏色。其函數的原型如下所示:
bool imagesetpixel(resource $image,int $x,int $y,int $color) //畫一個單一像素
該函數在第一個參數$image中提供的畫布上,距離圓點分別為$x和$y的座標位置,繪製一個顏色為$color的一個像素點。理論上使用畫點函數便可以畫出所需要的所有圖形,也可以使用其他的繪圖函數。如果需要繪製一條線段,可以使用imageline()函數,其文法格式如下所示:
bool imageline(resource $image,int $x1,int $y1,int $x2,int $y2,int $color) //畫一條線段
我們都知道兩點確定一條線段,所以該函數使用$color顏色在映像$image中,從座標($x1,$x2)開始到($x2,$y2)座標結束畫一條線段。
3.繪製矩形imageRectangle()、imageFilledRectangle()
可以使用imageRectangle()函數繪製矩形,也可以通過imageFilledRectangle()函數繪製一個矩形並填充。這兩個函數的文法格式如下所示:
bool imagerectangle(resource $image,int $x1 , int $y1,int $x2,int $y2,int $color) //畫一個矩形
bool imagefilledrectangle(resource image,int $x1 ,int $y1 ,int $x2 ,int $y2,int $color) //畫一個矩形並填充
這兩個函數的行為類似,都是在$image映像中畫一個矩形,只不過前者是使用$color參數指定矩形的邊線顏色,而後者則是使用這個顏色填充矩形。相對於映像左上方的(0,0)位置,矩形的左上方座標為($x1,$y1),右下角座標為($x2,$y2)。
4.繪製多邊形imagePolygon()、imagefilledpolygon()
可以使用imagePolygon()函數繪製一個多邊形,也可以通過imageFilledPolygon()函數繪製一個多邊形並填充。這兩個函數的文法格式如下:
bool imagepolygon(resource $image,array $points,int $num_points,int $color) //畫一個多邊形
bool imagefilledpolygon(resource $image ,array $points,int $num_points,int $color) //畫一個多邊形並填充
這兩個函數的行為類似,都是在$image映像中畫一個多邊形,只不過前者是使用$color參數指定多邊形的邊線顏色,而後者則是使用這個顏色填充多邊形。第二個參數$points是一個PHP數組,包含了多邊形的各個頂點座標。即points[0]=x0,points[1]=y0,points[2]=x1,points[3]=y1,依此類推。第三個參數$num_points是頂點的總數,必須大於3.
5.繪製橢圓imageEllipse()、imageFilledElipse()
可以使用imageEllipse()函數繪製一個橢圓,也可以通過imageFilledEllipse()函數繪製一個橢圓並填充。這兩個函數的文法格式如下:
bool imageellipse(resource $image,int $cx,int $cy,int $w,int $h,int $color) //畫一個橢圓
bool imagefilledellipse(resource $image,int $cx,int $cy,int $w,int $h,int $color) //畫一個橢圓填充
這兩個函數行為類似,都是在$image映像中畫一個橢圓,只不過前者是使用$color參數指定橢圓形的邊線顏色,而後者則是使用它填充顏色。相對於畫布左上方座標(0,0),以($cx,$cy)座標為中心畫一個橢圓,參數$w和$h分別指定了橢圓的寬和高。如果成功則返回TRUE,失敗則返回FALSE。
6.繪製弧線imageArc()
就是使用繪製填充圓弧的函數實現的。可以使用imageArc()函數繪製一條弧線,以及圓形和橢圓形。這個函數的文法格式如下:
bool imagearc(resource $image ,int $cx,int $cy,int $w,int $h,int $s,int $e ,int $color) //畫橢圓弧
相對於畫布左上方座標(0,0),該函數以($cx,$cy)座標為中心,在$image所代表的映像中畫一個橢圓弧。其中參數$w和$h分別指定了橢圓的寬度和高度,起始點和結束點以$s和$e參數以角度指定。0º位於三點鐘位置,以順時針方向繪畫。如果要繪製一個完整的圓形,首先要將參數$w和$h設定為相等的值,然後將起始角度$s設定為0,結束角度$e指定為360.如果需要繪製填充圓弧,可以查詢imageFilledArc()函數使用。
下面再看一個由圖片處理函數產生的一個 3D扇形統計圖樣本
| 代碼如下 |
複製代碼 |
|
<?php
//建立畫布,返回一個資源類型的變數$image,並在記憶體中開闢一個臨時地區
$image = imagecreatetruecolor(100, 100); //建立畫布大小為100x100
//設定映像中所需的顏色,相當於在畫畫時準備的染料盒
$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF); //為映像分配顏色為白色
$gray = imagecolorallocate($image, 0xC0, 0xC0, 0xC0); //為映像分配顏色為灰色
$darkgray = imagecolorallocate($image, 0x90, 0x90, 0x90); //為映像分配顏色為暗灰色
$navy = imagecolorallocate($image, 0x00, 0x00, 0x80); //為映像分配顏色為深藍色
$darknavy = imagecolorallocate($image, 0x00, 0x00, 0x50); //為映像分配顏色為暗深藍色
$red = imagecolorallocate($image, 0xFF, 0x00, 0x00); //為映像分配顏色為紅色
$darkred = imagecolorallocate($image, 0x90, 0x00, 0x00); //為映像分配顏色為暗紅色
imagefill($image, 0, 0, $white); //為畫布背景填充背景顏色
//動態製作3D效果
for ($i = 60; $i >50; $i--){ //迴圈10次畫出立體效果
imagefilledarc($image, 50, $i, 100, 50, -160, 40, $darknavy, IMG_ARC_PIE);
imagefilledarc($image, 50, $i, 100, 50, 40, 75, $darkgray, IMG_ARC_PIE);
imagefilledarc($image, 50, $i, 100, 50, 75, 200, $darkred, IMG_ARC_PIE);
}
imagefilledarc($image, 50, 50, 100, 50, -160, 40, $navy, IMG_ARC_PIE); //畫一橢圓弧且填充
imagefilledarc($image, 50, 50, 100, 50, 40 , 75, $gray, IMG_ARC_PIE); //畫一橢圓弧且填充
imagefilledarc($image, 50, 50, 100, 50, 75, 200, $red, IMG_ARC_PIE); //畫一橢圓弧且填充
imagestring($image, 1, 15, 55, '34.7%', $white); //水平地畫一行字串
imagestring($image, 1, 45, 35, '55.5%', $white); //水平地畫一行字串
//向瀏覽器中輸出一個GIF格式的圖片
header('Content-type:image/png'); //使用頭函數告訴瀏覽器以映像方式處理以下輸出
imagepng($image); //向瀏覽器輸出
imagedestroy($image); //銷毀映像釋放資源
?> |
直接通過瀏覽器請求該指令碼,或是將該指令碼所在的URL,賦給HTML中的IMG標記的src屬性,都可以擷取動態輸出的映像結果,如下圖所示: