溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

php中的繪圖技術(shù)是什么

發(fā)布時間:2020-07-16 13:56:46 來源:億速云 閱讀:161 作者:Leah 欄目:編程語言

本篇文章為大家展示了php中的繪圖技術(shù)是什么,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

 在php中,使用php繪圖,在訪問php文件時可以出現(xiàn)我們繪制的圖像。php繪圖技術(shù)可以應(yīng)用于報表的開發(fā)、驗證碼的設(shè)計。

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

php中的繪圖技術(shù)是什么

      特別說明:像素不是一個長度單位,而是一個密度單位。理論上,分辨率越小,一個像素所占的長度會大大一些。

     

php繪圖的基本原理和步驟

1)創(chuàng)建畫布

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

3)輸出圖像到網(wǎng)頁,也可以另存(可以另存為網(wǎng)站開發(fā)常見的幾種圖片格式,基于存儲格式問題,下面介紹一下常見圖片格式的特點)

4)銷毀該圖片(釋放內(nèi)存)

目前網(wǎng)站開發(fā)常見的圖片格式有:gif  jpg/jpeg  png   bmp...

總結(jié):

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

jpg/jpeg 圖片壓縮率高(有損壓縮),可以用較小的文件來顯示,網(wǎng)頁上用的比較多;

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

現(xiàn)在,開始介紹一下php中自帶的繪圖函數(shù)。在開講之前,首先要確認php配置文件中是否已經(jīng)啟用了gd庫(php的繪圖庫)——  extension=php_gd2.dll。如果沒有啟用,則啟用后需重啟apache!?。?/span>

php繪圖中,我們首先要創(chuàng)建畫布,默認畫布的背景色是黑色。

//1.創(chuàng)建畫布,默認的背景是黑色
$im=imagecreatetruecolor(400,300);
//默認是黑色背景,修改為白色
$white=imagecolorallocate($im,255,255,255);
imagefill($im,0,0,$white);

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

選擇繪制圖形使用的顏色(這里使用紅色)

//創(chuàng)建一個顏色
$red=imagecolorallocate($im,255,0,0);

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

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

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

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

第6個參數(shù)表示使用的顏色。

(2)畫直線

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

第1個參數(shù)表示在哪個畫布在繪圖;

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

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

第6個參數(shù)表示使用的顏色。

(3)畫矩形

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

第1個參數(shù)表示在哪個畫布在繪圖;

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

第4、5個參數(shù)表示矩形的寬、高;

第6個參數(shù)表示使用的顏色。

(4)畫填充矩形

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

(參數(shù)含義同”畫矩形“)
(5)畫弧線

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

畫弧線是基于類似畫橢圓的參數(shù)傳遞參數(shù)的。

第1個參數(shù)表示在哪個畫布在繪圖;

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

第4、5個參數(shù)表示弧線所在橢圓的寬、高;

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

第8個參數(shù)表示使用的顏色。

(6)畫扇形

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

(前8個參數(shù)的含義同”畫弧線“)第9個參數(shù)是php中自帶的常量。該值可以為:

IMG_ARC_PIE

IMG_ARC_CHORD

IMG_ARC_NOFILL

IMG_ARC_EDGED

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

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

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

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

這里特別注意的是:雖然我這張圖片的后綴名為jpg,但實際上我調(diào)用的卻是加載格式為jpg圖片的函數(shù)??赡茏x者會納悶,為什么不是調(diào)用imagecreatefromjpeg這個函數(shù)呢?實際上,文件的后綴名不能讓我們斷定該文件究竟屬于哪種格式,也就是說即便現(xiàn)在這張圖片的后綴名是.jpg,但是也有可能這個圖片的真正格式是png格式。那么如何知道該圖片的真正格式呢?可以使用getimagesize("arrow.jpg"); 查看該圖片的格式。

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

打印出返回結(jié)果$test后,你就會知道它返回結(jié)果的含義了。包括我們可以清楚地知道該圖片的”真面目“,其實格式是png格式。同樣還可使用該函數(shù),得到源圖片的寬、高。

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

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

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

第1個參數(shù)表示在哪個畫布在繪圖;

第2參數(shù)表示加載的源圖片;

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

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

第7、8個參數(shù)表示截取原圖片的寬、高值。

(8)寫字

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

第1個參數(shù)表示在哪個畫布在繪圖;

第2個參數(shù)表示內(nèi)置字體(取值是1、2、3、4或5);

第3、4個參數(shù)表示所要繪制的內(nèi)容的左上角的位置坐標;

第5個參數(shù)表示所要繪制的內(nèi)容;第6個參數(shù)表示使用的顏色。

使用imagestring函數(shù)繪制中文時會出現(xiàn)亂碼,這里需要使用到另一個函數(shù) imagettftext。

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

第1個參數(shù)表示在哪個畫布在繪圖;

第2個參數(shù)表示字體大??;

第3個參數(shù)表示設(shè)置字體旋轉(zhuǎn)的角度;

第4、5個參數(shù)表示所要繪制的內(nèi)容的左上角的位置坐標;

第6個參數(shù)表示使用的顏色;

第7個參數(shù)表示字體名稱,從字體庫復(fù)制到當前目錄下的字體名;

第8個參數(shù)表示所要繪制的內(nèi)容。

最后,繪制完畢后,需要將圖像輸出到網(wǎng)頁——http響應(yīng),另存!

同時還要銷毀該圖片(釋放內(nèi)存——服務(wù)器的內(nèi)存)。

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

//4.銷毀該圖片(釋放內(nèi)存--服務(wù)器內(nèi)存)
imagedestory($im);

特別注意:繪制完畢后要釋放內(nèi)存這一操作。

完整php程序代碼:

<?php
	//php繪圖技術(shù),參考文檔

	//1.創(chuàng)建畫布,默認的背景是黑色
	$im=imagecreatetruecolor(400,300);
	//默認是黑色背景,修改為白色
	$white=imagecolorallocate($im,255,255,255);
	imagefill($im,0,0,$white);

	//2.繪制需要的各種圖形(圓,直線,矩形,弧線,扇形...)
	//創(chuàng)建一個顏色
	$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寫中文會出現(xiàn)亂碼
	imagestring($im,5,0,0,$str,$red);
	//在字體庫中找中文字體(將字體拷貝到當前目錄)
	//字體旋轉(zhuǎn)時是逆時針旋轉(zhuǎn)
	imagettftext($im,15,10,50,50,$red,"SIMYOU.TTF",$str);

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

	//4.銷毀該圖片(釋放內(nèi)存--服務(wù)器內(nèi)存)
	imagedestory($im);
?>

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

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

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

	//2.畫出扇形
	//創(chuàng)建三個顏色
	$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);


	//輸出圖像到網(wǎng)頁,也可以另存
	header("content-type:image/png");
	imagepng($im);

	//銷毀該圖片(釋放內(nèi)存--服務(wù)器內(nèi)存)
	imagedestory($im);


	//可以將其封裝成一個函數(shù)
?>

結(jié)果如下:

php中的繪圖技術(shù)是什么

另外,我們可以使用php繪圖技術(shù)制作驗證碼,這里不多加解釋,程序代碼如下:

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;
    //創(chuàng)建圖片,并把隨機數(shù)畫上去
    $img=imagecreatetruecolor(110, 30);
    //背景默認就是黑色
    //你可以指定背景顏色
    $bgcolor=imagecolorallocate($img, 0, 0, 0);
    imagefill($img, 0, 0, $bgcolor);
    //創(chuàng)建新的顏色
    $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的使用——用于登錄界面(這里只提供部分代碼,但是不影響理解,可刪除無關(guān)內(nèi)容,直接使用)

<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技術(shù),在服務(wù)器端保存隨機出來的驗證碼的值,當用戶登錄時,用戶提交驗證碼時,可以用session取出正確的驗證碼進行比對。

上述內(nèi)容就是php中的繪圖技術(shù)是什么,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI