php中的繪圖技術詳解

2020-07-16 10:06:00
在php中,使用php繪圖,在存取php檔案時可以出現我們繪製的影象。php繪圖技術可以應用於報表的開發、驗證碼的設計。

在介紹php繪圖技術之前,我們首先需要了解一下php中的繪圖坐標系:php坐標系中,坐標原點位於左上角,以畫素為單位。坐標(x,y)——第一個是x坐標,表示當前位置為水平方向,距離坐標原點x個畫素;第二個是y坐標,表示當前位置為垂直方向,距離坐標點y個畫素。


特別說明:畫素不是一個長度單位,而是一個密度單位。理論上,解析度越小,一個畫素所佔的長度會大大一些。

php繪圖的基本原理和步驟

1)建立畫布

2)繪製需要的各種圖形(圓,直線,矩形,弧線,扇形...

3)輸出影象到網頁,也可以另存(可以另存為網站開發常見的幾種圖片格式,基於儲存格式問題,下面介紹一下常見圖片格式的特點)

4)銷毀該圖片(釋放記憶體)

目前網站開發常見的圖片格式有:gif jpg/jpeg png bmp...

總結:

gif 圖片壓縮率高,但是只能顯示256色,可能造成顏色丟失,可以顯示動畫圖片;

jpg/jpeg 圖片壓縮率高(有失真壓縮),可以用較小的檔案來顯示,網頁上用的比較多;

png(高保真) 該格式綜合了gifjpg的優勢,缺點就是不能顯示動畫。


現在,開始介紹一下php中自帶的繪圖函數。在開講之前,首先要確認php組態檔中是否已經啟用了gd庫(php的繪相簿)—— extension=php_gd2.dll。如果沒有啟用,則啟用後需重新啟動apache!!!

php繪圖中,我們首先要建立畫布,預設畫布的背景色是黑色。

//1.建立畫布,預設的背景是黑色
$im=imagecreatetruecolor(400,300);
//預設是黑色背景,修改為白色
$white=imagecolorallocate($im,255,255,255);
imagefill($im,0,0,$white);

開始在畫布$im上繪製圖形:

選擇繪製圖形使用的顏色(這裡使用紅色)

//建立一個顏色
$red=imagecolorallocate($im,255,0,0);

(1)畫橢圓(當然用同樣的函數也可以畫出圓)

imageellipse($im,20,20,20,20,$red);

第1個參數列示在哪個畫布在繪圖;第2、3個參數列示橢圓的中心坐標(x,y);

第4、5個參數列示橢圓的寬、高(當然寬、高相同時則畫出來的橢圓就是圓);

第6個參數列示使用的顏色。

(2)畫直線

imageline($im,0,0,400,300,$red);

第1個參數列示在哪個畫布在繪圖;

第2、3個參數列示直線的起點坐標(x1,y1);

第4、5個參數列示直線的終點坐標(x2,y2);

第6個參數列示使用的顏色。

(3)畫矩形

imagerectangle($im,2,2,40,50,$red);

第1個參數列示在哪個畫布在繪圖;

第2、3個參數列示矩形的左上角坐標(x1,y1);

第4、5個參數列示矩形的寬、高

第6個參數列示使用的顏色。

(4)畫填充矩形

imagefilledrectangle($im,2,2,40,50,$red);

(引數含義同」畫矩形「)
(5)畫弧線

imagearc($im,100,100,50,50,0,30,$red);

畫弧線是基於類似畫橢圓的引數傳遞引數的。

第1個參數列示在哪個畫布在繪圖;

第2、3個參數列示弧線所在橢圓的中心坐標(x,y);

第4、5個參數列示弧線所在橢圓的寬、高;

第6、7個參數列示從(第6個引數的值)度到(第7個引數的值)度(如,第6、7個引數值分別為0、30,此時表示從0°順時針旋轉30°畫出弧線,而0°所在方向是水平向右的方向);

第8個參數列示使用的顏色。

(6)畫扇形

imagefilledarc($im,100,100,80,50,180,270,$red,IMG_ARC_PIE);

(前8個引數的含義同」畫弧線「)第9個引數是php中自帶的常數。該值可以為:

IMG_ARC_PIE

IMG_ARC_CHORD

IMG_ARC_NOFILL

IMG_ARC_EDGED

IMG_ARC_PIE和IMG_ARC_CHORD是互斥的;IMG_ARC_CHORD只是用直線連線了起始和結束點,IMG_ARC_PIE則產生圓形邊界。IMG_ARC_NOFILL指明弧或弦只有輪廓,不填充。IMG_ARC_EDGED指明用直線將起始和結束點與中心點相連,和IMG_ARC_NOFILL一起使用是畫餅狀圖輪廓的好方法(而不用填充)。

(7)拷貝源圖片到目標畫布

首先要載入源圖片(如,arrow.jpg)

//載入源圖片
$srcImage=imagecreatefrompng("arrow.jpg");

這裡特別注意的是:雖然我這張圖片的字尾名為jpg,但實際上我呼叫的卻是載入格式為jpg圖片的函數。可能讀者會納悶,為什麼不是呼叫imagecreatefromjpeg這個函數呢?實際上,檔案的字尾名不能讓我們斷定該檔案究竟屬於哪種格式,也就是說即便現在這張圖片的字尾名是.jpg,但是也有可能這個圖片的真正格式是png格式。那麼如何知道該圖片的真正格式呢?可以使用getimagesize("arrow.jpg"); 檢視該圖片的格式。

$test=getimagesize("arrow.jpg");
print_r($test);

列印出返回結果$test後,你就會知道它返回結果的含義了。包括我們可以清楚地知道該圖片的」真面目「,其實格式是png格式。同樣還可使用該函數,得到源圖片的寬、高。

//這裡我們可以使用一個getimagesize()
$srcImageInfo=getimagesize("arrow.jpg");
$imageWidth=$srcImageInfo[0];
$imageHeight=$srcImageInfo[1];

得到寬、高後,將圖片拷貝到目標畫布上。

//拷貝源圖片到目標畫布
imagecopy($im,$srcImage,0,0,100,0,$imageWidth,$imageHeight);

第1個參數列示在哪個畫布在繪圖;

第2參數列示載入的源圖片;

第3、4個參數列示目標畫布的坐標(x1,y1)(拷貝至畫布的坐標(x1,y1)位置);

第5、6個參數列示擷取原圖片的左上角的坐標(x2,y2)位置;

第7、8個參數列示擷取原圖片的寬、高值。

(8)寫字

$str="hello,world!你好,世界!";
//使用imagestring寫中文會出現亂碼
imagestring($im,5,0,0,$str,$red);

第1個參數列示在哪個畫布在繪圖;

第2個參數列示內建字型(取值是1、2、3、4或5);

第3、4個參數列示所要繪製的內容的左上角的位置坐標;

第5個參數列示所要繪製的內容;第6個參數列示使用的顏色。

使用imagestring函數繪製中文時會出現亂碼,這裡需要使用到另一個函數 imagettftext。

//在字型庫中找中文字型(將字型拷貝到當前目錄)
//字型旋轉時是逆時針旋轉
imagettftext($im,15,10,50,50,$red,"SIMYOU.TTF",$str);

第1個參數列示在哪個畫布在繪圖;

第2個參數列示字型大小;

第3個參數列示設定字型旋轉的角度;

第4、5個參數列示所要繪製的內容的左上角的位置坐標;

第6個參數列示使用的顏色;

第7個參數列示字型名稱,從字型庫複製到當前目錄下的字型名;

第8個參數列示所要繪製的內容。


最後,繪製完畢後,需要將影象輸出到網頁——http響應,另存!

同時還要銷毀該圖片(釋放記憶體——伺服器的記憶體)。

//3.輸出影象到網頁,也可以另存
header("content-type:image/png");
imagepng($im);

//4.銷毀該圖片(釋放記憶體--伺服器記憶體)
imagedestory($im);

特別注意:繪製完畢後要釋放記憶體這一操作。

完整php程式程式碼:

<?php
	//php繪圖技術,參考文件

	//1.建立畫布,預設的背景是黑色
	$im=imagecreatetruecolor(400,300);
	//預設是黑色背景,修改為白色
	$white=imagecolorallocate($im,255,255,255);
	imagefill($im,0,0,$white);

	//2.繪製需要的各種圖形(圓,直線,矩形,弧線,扇形...)
	//建立一個顏色
	$red=imagecolorallocate($im,255,0,0);
	//圓
	imageellipse($im,20,20,20,20,$red);
	//直線
	imageline($im,0,0,400,300,$red);
	//矩形
	imagerectangle($im,2,2,40,50,$red);
	//填充矩形
	imagefilledrectangle($im,2,2,40,50,$red);
	//弧線
	imagearc($im,100,100,50,50,0,30,$red);
	//扇形
	imagefilledarc($im,100,100,80,50,180,270,$red,IMG_ARC_PIE);

	//拷貝圖片到畫布
	//載入源圖片
	$srcImage=imagecreatefrompng("arrow.jpg");
	//$test=getimagesize("arrow.jpg");
	//print_r($test);
	
	//這裡我們可以使用一個getimagesize()
	$srcImageInfo=getimagesize("arrow.jpg");
	$imageWidth=$srcImageInfo[0];
	$imageHeight=$srcImageInfo[1];

	//拷貝源圖片到目標畫布
	imagecopy($im,$srcImage,0,0,100,0,$imageWidth,$imageHeight);

	//寫字
	$str="hello,world!你好,世界!";
	//使用imagestring寫中文會出現亂碼
	imagestring($im,5,0,0,$str,$red);
	//在字型庫中找中文字型(將字型拷貝到當前目錄)
	//字型旋轉時是逆時針旋轉
	imagettftext($im,15,10,50,50,$red,"SIMYOU.TTF",$str);

	//3.輸出影象到網頁,也可以另存
	header("content-type:image/png");
	imagepng($im);

	//4.銷毀該圖片(釋放記憶體--伺服器記憶體)
	imagedestory($im);
?>

這裡還有一個案例(在php手冊中也有)——繪製3D餅狀圖:

<?php
	//分析思路(先畫出扇形)
	//1.畫布
	$im=imagecreatetruecolor(400,300);

	//預設是黑色背景,修改為白色
	$white=imagecolorallocate($im,255,255,255);
	imagefill($im,0,0,$white);

	//2.畫出扇形
	//建立三個顏色
	$red=imagecolorallocate($im,254,0,0);
	$darkred=imagecolorallocate($im,144,0,0);

	$blue=imagecolorallocate($im,0,0,128);
	$darkblue=imagecolorallocate($im,0,0,80);

	$gray=imagecolorallocate($im,192,192,192);
	$darkgray=imagecolorallocate($im,144,144,144);

	for($i=60;$i>=50;$i--) {
		imagefilledarc($im,100,$i,100,50,75,360,$darkred,IMG_ARC_PIE);
		imagefilledarc($im,100,$i,100,50,0,35,$darkblue,IMG_ARC_PIE);
		imagefilledarc($im,100,$i,100,50,35,75,$darkgray,IMG_ARC_PIE);
	}

	imagefilledarc($im,100,50,100,50,75,360,$red,IMG_ARC_PIE);
	imagefilledarc($im,100,50,100,50,0,35,$blue,IMG_ARC_PIE);
	imagefilledarc($im,100,50,100,50,35,75,$gray,IMG_ARC_PIE);


	//輸出影象到網頁,也可以另存
	header("content-type:image/png");
	imagepng($im);

	//銷毀該圖片(釋放記憶體--伺服器記憶體)
	imagedestory($im);


	//可以將其封裝成一個函數
?>

結果如下:



另外,我們可以使用php繪圖技術製作驗證碼,這裡不多加解釋,程式程式碼如下:

checkCode.php

<?php
    //echo rand(2,9);
    //echo "<br/>".dechex(rand(1,15))."<br/>";
    session_start();
    $checkCode="";
    for($i=0;$i<4;$i++) {
        $checkCode.=dechex(rand(1,15));
    }
    
    //講隨機驗證碼儲存到session中
    $_SESSION['myCheckCode']=$checkCode;
    //建立圖片,並把亂數畫上去
    $img=imagecreatetruecolor(110, 30);
    //背景預設就是黑色
    //你可以指定背景顏色
    $bgcolor=imagecolorallocate($img, 0, 0, 0);
    imagefill($img, 0, 0, $bgcolor);
    //建立新的顏色
    $white=imagecolorallocate($img, 255, 255, 255);
    $blue=imagecolorallocate($img, 0, 0, 255);
    $red=imagecolorallocate($img, 255, 0, 0);
    $green=imagecolorallocate($img, 0, 255, 0);
    
    //畫出干擾線段
    for($i=0;$i<20;$i++) {
        //更好的方法是顏色隨機
        imageline($img, rand(0,110), rand(0,30), rand(0,110), rand(0,30), 
            imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255)));
    }
    
    //畫出噪點,自己畫
    //for($i=0;$i<10;$i++)
    //把四個隨機值畫上去
    
    imagestring($img, rand(1,5), rand(2,80), rand(2,10), $checkCode, $white);
    
    //如果要使用中文
    //array imagefttext(string $font_file, string $text [,array $extrainfo)
    //imagettftext($img,15,10,20,25,$white,"STXINWET.TTF","北京你好");
    //輸出
    header("content-type: image/png");
    imagepng($img);
    
?>

checkCode.php的使用——用於登入介面(這裡只提供部分程式碼,但是不影響理解,可刪除無關內容,直接使用)

<form action="loginProcess.php" method="post">
<table>
<tr><td>使用者id</td><td><input type="text" name="id" value="<?php echo getCookieVal("id"); ?>"/></td></tr>
<tr><td>密 碼</td><td><input type="password" name="password"/></td></tr>
<tr><td>驗證碼</td><td><input type="text" name="checkCode"/>
<img src="checkCode.php" onClick="this.src='checkCode.php?aa='+Math.random()"/></td></tr>
<tr><td colspan="2">是否儲存使用者id<input type="checkbox" value="yes" name="keep"></td></tr>
<tr><td><input type="submit" value="使用者登入"/></td>
<td><input type="reset" value="重新填寫"/></td></tr>
</table>
</form>

當點選驗證碼時,驗證碼會進行重新整理。checkCode.php中還使用到session技術,在伺服器端儲存隨機出來的驗證碼的值,當使用者登入時,使用者提交驗證碼時,可以用session取出正確的驗證碼進行比對。

以上就是php中的繪圖技術詳解的詳細內容,更多請關注TW511.COM其它相關文章!