本篇文章為大家展示了php中的繪圖技術是什么,代碼簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
在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(高保真) 該格式綜合了gif和jpg的優勢,缺點就是不能顯示動畫。
現在,開始介紹一下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圖片的函數??赡茏x者會納悶,為什么不是調用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中的繪圖技術是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。