驗證碼是咱們開發的時候常常用到的功能,因此在此本人包裝了一個驗證碼類,應該能夠做爲php的類插件用,在此分享給各位博客園的讀友。php
實現的原理也是很簡單,就是利用畫布的幾個函數,再加上一些字符串的獲取,東湊西湊就構成了,呵呵。瀏覽器
這裏大概寫一下思路吧,其實這個類已經註釋的很是清楚了,不過,我的仍是在行文前囉嗦一下。函數
首先是關於一些函數的解釋,這裏的解釋純屬我的體會,有什麼錯誤的地方,還請讀者指正。字體
1、建立畫布函數:imagecreatetruecolor(w,h);this
說明:用於建立一個畫布。spa
w 畫布的寬插件
h 畫布的高code
此函數的返回值資源類(gd)blog
2、爲畫布建立一種顏色:imagecolorallocate(img,red,green,blue)接口
說明:
img畫布資源
red,green,blue 是0~255的範圍
三、爲畫布添加背景色
imagefill(img,x,y,color);
說明:
在 image
圖像的座標 x
,y
(圖像左上角爲 0, 0)
4、畫邊框
imagerectangle($img,x1,y1,x2,y2,color);
說明:
其左上角座標爲 x1, y1,右下角座標爲 x2, y2。圖像的左上角座標爲 0, 0。
3、繪製內容(字符)
imagestring(img ,size,x,y,string,color);
說明:
img畫布
size是字大小 1至5
x,y是起始點
string是所要畫的內容
color是顏色
4、告訴瀏覽器圖片格式
header("Content-type:image/png");可爲image/gif等等
5、輸出(或保存),也能夠使用第2個參數實現保存
imagepng(img【,filename】)
imagejpeg(img【,filename】)
imagegif(img【,filename】)
6、添加干擾線,本質就是直線
imageline(img,x1,y1,x2,y2,color);
說明:
img 畫布
x1,y1 起點
x2,y2 終點
color 顏色
七、imagettftext ( img,size, angle, x, y, color, fontfile,text )
說明:
img 畫布
size 字體大小,缺省單位像素
angle 角度
x,y 座標點
color 顏色
fontfile 字體文件,必須是中文字體
text 內容
特別說明:這裏的color參數都是imagecolorallocate()函數建立的顏色
下面是思路:
這裏最早生成畫布,以後就是爲畫布添加字符串,直線,噪點,邊框,來生成驗證碼的,最後類返回的兩個公用接口是:可供外面調用的生成驗證碼的畫布和驗證碼的字符串構成,爲的是給外界輸出驗證碼畫布,以及存儲字符串,做爲驗證用
下面是代碼:
<?php namespace captcha; /* *驗證碼類 *verify方法生成驗證碼字符串 *entry方法生成驗證碼 *特別提醒:這裏要先用entry生成驗證碼,再用verify生成驗證碼的字符串,也就是必須先調用entry,而後纔可以調用verify生成驗證碼的字符串,緣由代碼已經說明問題了,由於驗證碼的字符串是在entry方法調用captchaImage生成的,因此必須先調用它才行 *有的地方對中文的字體要求比較高,因此,有的地方不支持中文驗證碼 */ class Captcha{ //配置參數 private $config = array(); //驗證碼 private $verifyCode = ''; //獲取配置文件的配置信息,給類傳參數就行,例如new Captcha($config);$config是你的配置文件信息 public function __construct($config=array('width'=>100,'height'=>40,'length'=>4,'size'=>7,'lines'=>0,'dots'=>0,'font'=>'simfang.ttf','rectangle'=>array(255,55,122),'charset'=>true,'chinese'=>'來到新機場主航站樓建設在婚姻關係存續期間所負債務她在收到要求她償還前夫在婚姻關係存續期間所欠債務的法院傳票後要精益求精有始有終')){ $this->config = $config; } //建立驗證碼 private function captchaImage(){ //畫布 $img = imagecreatetruecolor($this->config['width'],$this->config['height']); //填充畫布顏色 imagefill($img,0,0,imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255))); //須要邊框則畫邊框 if($this->config['rectangle'] && is_array($this->config['rectangle']) && count($this->config['rectangle']) == 3){ $this->tangle($img); } $this->verifyCode = $this->code($img,$this->config['charset'],$this->config['chinese']); //存在則添加干擾線 if($this->config['lines']){ $this->codeLines($img); } //存在則添加干擾點 if($this->config['dots']){ $this->codeDots($img); } return $img; } private function codeLines($img){ //繪製干擾線 for($i=0;$i<$this->config['lines'];$i++){ imageline($img,mt_rand(0,$this->config['width'] / 10),mt_rand(0,$this->config['height']),mt_rand($this->config['width'] * 7/ 10,$this->config['width'] * 9/ 10),mt_rand(0,$this->config['height']),imagecolorallocate($img,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255))); } } private function codeDots($img){ //添加噪點 for($i=0;$i<$this->config['dots'];$i++){ //噪點顏色 $color = imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)); imagestring($img,mt_rand(1,3),mt_rand(0,170),mt_rand(0,30),'*',$color); } } /*畫布邊框*/ private function tangle($img){ imagerectangle($img,0,0,$this->config['width']-1,$this->config['height']-1,imagecolorallocate($img,$this->config['rectangle'][0],$this->config['rectangle'][1],$this->config['rectangle'][2])); } /*生成驗證碼,默認英文,$ch爲true則爲中文*/ private function code($img,$ch=false,$set=''){ $str = ""; //計算間隔 $span = ceil($this->config['width']/($this->config['length']+1)); if($ch && !empty($set)){ //隨機產生字符 $set = $this->config['chinese']; for($i=0;$i<$this->config['length'];$i++){ $end = strlen($set)/3; $pos = mt_rand(0,$end-1); $str .= substr($set,$pos*3,3); } //每次繪製一個字符 for($i=1;$i<=$this->config['length'];$i++){ imagettftext($img,16,mt_rand(-30,60),$i*$span,$this->config['height']*3/5,imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180)),$this->config['font'],substr($str,($i-1)*3,3)); } }else{ //隨機生成字母或者數字 for($i=0;$i<$this->config['length'];$i++){ switch(mt_rand(0,2)){ case 0: $str .= chr(mt_rand(65,90)); break; case 1: $str .= chr(mt_rand(97,122)); break; case 2: $str .= chr(mt_rand(48,57)); } } //每次繪製一個字符 for($i=1;$i<=$this->config['length'];$i++){ imagestring($img,$this->config['size'],$i*$span,0,$str[$i-1],imagecolorallocate($img,mt_rand(0,180),mt_rand(0,180),mt_rand(0,180))); } } return $str; } //獲取驗證碼 public function verify(){ return $this->verifyCode; } //生成驗證碼 public function entry(){ header("content-type:image/png"); imagepng($this->captchaImage()); } } $ob = new Captcha; $ob->entry();
最後,爲了避免誤人子弟,仍是再強調一遍:
這裏必須先用entry生成驗證碼,再用verify生成驗證碼的字符串,也就是必須先調用entry,而後纔可以調用verify生成驗證碼的字符串,緣由代碼已經說明問題了,由於驗證碼的字符串是在entry方法的方法captchaImage中生成的,因此必須先調用它才行 有的地方對中文的字體要求比較高,因此,有的地方不支持中文驗證碼
要是以爲對你有幫助,能夠掃一掃右邊的打賞功能,打賞一下做者呢