php封裝的驗(yàn)證碼類分享
驗(yàn)證碼是我們開(kāi)發(fā)的時(shí)候經(jīng)常用到的功能,所以在此本人包裝了一個(gè)驗(yàn)證碼類,應(yīng)該可以作為php的類插件用,在此分享給各位讀友。
實(shí)現(xiàn)的原理也是很簡(jiǎn)單,就是利用畫(huà)布的幾個(gè)函數(shù),再加上一些字符串的獲取,東湊西湊就構(gòu)成了,呵呵。
這里大概寫(xiě)一下思路吧,其實(shí)這個(gè)類已經(jīng)注釋的非常清楚了,不過(guò),個(gè)人還是在行文前啰嗦一下。
首先是關(guān)于一些函數(shù)的解釋,這里的解釋純屬個(gè)人體會(huì),有什么錯(cuò)誤的地方,還請(qǐng)讀者指正。
1、創(chuàng)建畫(huà)布函數(shù):imagecreatetruecolor(w,h);
說(shuō)明:用于創(chuàng)建一個(gè)畫(huà)布。
w 畫(huà)布的寬
h 畫(huà)布的高
此函數(shù)的返回值資源類(gd)
2、為畫(huà)布創(chuàng)建一種顏色:imagecolorallocate(img,red,green,blue)
說(shuō)明:
img畫(huà)布資源
red,green,blue 是0~255的范圍
3、為畫(huà)布添加背景色
imagefill(img,x,y,color);
說(shuō)明:
在 image 圖像的坐標(biāo) x,y(圖像左上角為 0, 0)
4、畫(huà)邊框
imagerectangle($img,x1,y1,x2,y2,color);
說(shuō)明:
其左上角坐標(biāo)為 x1, y1,右下角坐標(biāo)為 x2, y2。圖像的左上角坐標(biāo)為 0, 0。
3、繪制內(nèi)容(字符)
imagestring(img ,size,x,y,string,color);
說(shuō)明:
img畫(huà)布
size是字大小 1至5
x,y是起始點(diǎn)
string是所要畫(huà)的內(nèi)容
color是顏色
4、告訴瀏覽器圖片格式
header("Content-type:image/png");可為image/gif等等
5、輸出(或保存),也可以使用第2個(gè)參數(shù)實(shí)現(xiàn)保存
imagepng(img【,filename】)
imagejpeg(img【,filename】)
imagegif(img【,filename】)
6、添加干擾線,本質(zhì)就是直線
imageline(img,x1,y1,x2,y2,color);
說(shuō)明:
img 畫(huà)布
x1,y1 起點(diǎn)
x2,y2 終點(diǎn)
color 顏色
7、imagettftext ( img,size, angle, x, y, color, fontfile,text )
說(shuō)明:
img 畫(huà)布
size 字體大小,缺省單位像素
angle 角度
x,y 坐標(biāo)點(diǎn)
color 顏色
fontfile 字體文件,必須是中文字體
text 內(nèi)容
特別說(shuō)明:這里的color參數(shù)都是imagecolorallocate()函數(shù)創(chuàng)建的顏色
下面是思路:
這里最先生成畫(huà)布,之后就是為畫(huà)布添加字符串,直線,噪點(diǎn),邊框,來(lái)生成驗(yàn)證碼的,最后類返回的兩個(gè)公用接口是:可供外面調(diào)用的生成驗(yàn)證碼的畫(huà)布和驗(yàn)證碼的字符串構(gòu)成,為的是給外界輸出驗(yàn)證碼畫(huà)布,以及存儲(chǔ)字符串,作為驗(yàn)證用
下面是代碼:
<?php namespace captcha; /* *驗(yàn)證碼類 *verify方法生成驗(yàn)證碼字符串 *entry方法生成驗(yàn)證碼 *特別提醒:這里要先用entry生成驗(yàn)證碼,再用verify生成驗(yàn)證碼的字符串,也就是必須先調(diào)用entry,然后才能夠調(diào)用verify生成驗(yàn)證碼的字符串,原因代碼已經(jīng)說(shuō)明問(wèn)題了,因?yàn)轵?yàn)證碼的字符串是在entry方法調(diào)用captchaImage生成的,所以必須先調(diào)用它才行 *有的地方對(duì)中文的字體要求比較高,所以,有的地方不支持中文驗(yàn)證碼 */ class Captcha{ //配置參數(shù) private $config = array(); //驗(yàn)證碼 private $verifyCode = ''; //獲取配置文件的配置信息,給類傳參數(shù)就行,例如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'=>'來(lái)到新機(jī)場(chǎng)主航站樓建設(shè)在婚姻關(guān)系存續(xù)期間所負(fù)債務(wù)她在收到要求她償還前夫在婚姻關(guān)系存續(xù)期間所欠債務(wù)的法院傳票后要精益求精善始善終')){ $this->config = $config; } //創(chuàng)建驗(yàn)證碼 private function captchaImage(){ //畫(huà)布 $img = imagecreatetruecolor($this->config['width'],$this->config['height']); //填充畫(huà)布顏色 imagefill($img,0,0,imagecolorallocate($img,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255))); //需要邊框則畫(huà)邊框 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); } //存在則添加干擾點(diǎn) 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){ //添加噪點(diǎn) for($i=0;$i<$this->config['dots'];$i++){ //噪點(diǎn)顏色 $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); } } /*畫(huà)布邊框*/ 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])); } /*生成驗(yàn)證碼,默認(rèn)英文,$ch為true則為中文*/ private function code($img,$ch=false,$set=''){ $str = ""; //計(jì)算間隔 $span = ceil($this->config['width']/($this->config['length']+1)); if($ch && !empty($set)){ //隨機(jī)產(chǎn)生字符 $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); } //每次繪制一個(gè)字符 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{ //隨機(jī)生成字母或者數(shù)字 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)); } } //每次繪制一個(gè)字符 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; } //獲取驗(yàn)證碼 public function verify(){ return $this->verifyCode; } //生成驗(yàn)證碼 public function entry(){ header("content-type:image/png"); imagepng($this->captchaImage()); } } $ob = new Captcha; $ob->entry();
最后,為了不誤人子弟,還是再?gòu)?qiáng)調(diào)一遍:
這里必須先用entry生成驗(yàn)證碼,再用verify生成驗(yàn)證碼的字符串,也就是必須先調(diào)用entry,然后才能夠調(diào)用verify生成驗(yàn)證碼的字符串,原因代碼已經(jīng)說(shuō)明問(wèn)題了,因?yàn)轵?yàn)證碼的字符串是在entry方法的方法captchaImage中生成的,所以必須先調(diào)用它才行 有的地方對(duì)中文的字體要求比較高,所以,有的地方不支持中文驗(yàn)證碼
相關(guān)文章
destoon出現(xiàn)驗(yàn)證碼不顯示時(shí)的緊急處理方法
這篇文章主要介紹了destoon出現(xiàn)驗(yàn)證碼不顯示時(shí)的緊急處理方法,非常實(shí)用,需要的朋友可以參考下2014-08-08THINKPHP5分頁(yè)數(shù)據(jù)對(duì)象處理過(guò)程解析
這篇文章主要介紹了THINKPHP5分頁(yè)數(shù)據(jù)對(duì)象處理過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10PHP守護(hù)進(jìn)程化在C和PHP環(huán)境下的實(shí)現(xiàn)
這篇文章主要介紹了PHP守護(hù)進(jìn)程化的實(shí)現(xiàn)的方法以及原理過(guò)程,以及在C環(huán)境和PHP環(huán)境下實(shí)現(xiàn)的代碼,喜歡的朋友收藏一下。2017-11-11thinkPHP刪除前彈出確認(rèn)框的簡(jiǎn)單實(shí)現(xiàn)方法
這篇文章主要介紹了thinkPHP刪除前彈出確認(rèn)框的簡(jiǎn)單實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了thinkPHP前臺(tái)HTML部分結(jié)合js控制彈出框效果,以及后臺(tái)控制器的刪除數(shù)據(jù)處理功能,需要的朋友可以參考下2016-05-05Yii2使用$this->context獲取當(dāng)前的Module、Controller(控制器)、Action等
使用Yii2的時(shí)候,在某些場(chǎng)景和環(huán)境下需要獲得Yii2目前所處于的module(模型)、Controller(控制器)、Action(方法),以及會(huì)調(diào)用控制器里面已經(jīng)定義過(guò)的一些公共的方法等.對(duì)于這些問(wèn)題Yii2可以在視圖層View中使用$this->context這個(gè)對(duì)象去獲得。下面通過(guò)示例代碼給大家講解下2017-03-03CI框架AR數(shù)據(jù)庫(kù)操作常用函數(shù)總結(jié)
這篇文章主要介紹了CI框架AR數(shù)據(jù)庫(kù)操作常用函數(shù),結(jié)合實(shí)例形式總結(jié)分析了基于CI框架的數(shù)據(jù)庫(kù)增刪改查與緩存、結(jié)果集等相關(guān)操作函數(shù)與技巧,需要的朋友可以參考下2016-11-11