您好,登錄后才能下訂單哦!
本篇文章為大家展示了php中的繪圖技術(shù)是什么,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
在php中,使用php繪圖,在訪問php文件時可以出現(xiàn)我們繪制的圖像。php繪圖技術(shù)可以應(yīng)用于報表的開發(fā)、驗證碼的設(shè)計。
在介紹php繪圖技術(shù)之前,我們首先需要了解一下php中的繪圖坐標系:php坐標系中,坐標原點位于左上角,以像素為單位。坐標(x,y)——第一個是x坐標,表示當前位置為水平方向,距離坐標原點x個像素;第二個是y坐標,表示當前位置為垂直方向,距離坐標點y個像素。
特別說明:像素不是一個長度單位,而是一個密度單位。理論上,分辨率越小,一個像素所占的長度會大大一些。
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(高保真) 該格式綜合了gif和jpg的優(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ù)制作驗證碼,這里不多加解釋,程序代碼如下:
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è)資訊頻道。
免責聲明:本站發(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)容。