3.验证码类部分代码
3.1 定义变量
//随机因子private $charset = "abcdefghjkmnprstuvwxyzABCDEFGJKMNPRSTUVWXYZ23456789";private $code;private $codeLen = 4;private $width = 130;private $heigh = 50;private $img;//图像private $font;//字体private $fontsize = 20;$charset 是随机因子,这里是去掉了几个不容易区分的字符,如字母"i,l,o,q",数字"0,1"。有必要可以加入一些中文或其他字符或算式等。
public function __construct(){$this->font = ROOT_PATH."/font/Chowderhead.ttf";$this->img = imagecreatetruecolor($this->width, $this->heigh);}3.3从随机因子中随机抽取4个字符,作为$code验证码.
//生成随机码private function createCode(){$_len = strlen($this->charset) - 1;for ($i = 0; $i < $this->codeLen; $i++) {$this->code .= $this->charset[mt_rand(0, $_len)];}}3.4生成验证码背景色.
//生成背景private function createBg(){$color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));imagefilledrectangle($this->img, 0, $this->heigh, $this->width, 0, $color);}其中mt_rand(157, 255),目的是随机取比较浅的颜色。
//生成文字private function createFont(){$_x = $this->width / $this->codeLen;$_y = $this->heigh / 2;for ($i = 0; $i < $this->codeLen; $i++) {$color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));imagettftext($this->img, $this->fontsize, mt_rand(-30, 30), $_x * $i + mt_rand(3, 5), $_y + mt_rand(2, 4), $color, $this->font, $this->code[$i]);}}在图像上生成验证码文字,主要考虑文字在图像上的位置和每一个文字颜色。
//生成线条,雪花private function createLine(){for ($i = 0; $i < 15; $i++) {$color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->heigh), mt_rand(0, $this->width), mt_rand(0, $this->heigh), $color);}for ($i = 0; $i < 150; $i++) {$color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->heigh), "#", $color);}}画线条的时候,取比较深的颜色值,而画雪花的时候取比较淡的颜色值,目的是尽可能的不影响人眼识别验证码,又能干扰自动识别验证码机制。
//对外生成public function doImg(){$this->createBg(); //1.创建验证码背景$this->createCode();//2.生成随机码$this->createLine();//3.生成线条和雪花$this->createFont();//4.生成文字$this->outPut();//5.输出验证码图像}3.8完整代码:
<?php/** * Created by PhpStorm. * User: andy * Date: 16-12-22 * Time: 下午1:20 */class ValidateCode{//随机因子private $charset = "abcdefghjkmnprstuvwxyzABCDEFGJKMNPRSTUVWXYZ23456789";private $code;private $codeLen = 4;private $width = 130;private $heigh = 50;private $img;//图像private $font;//字体private $fontsize = 20;public function __construct(){$this->font = ROOT_PATH."/font/Chowderhead.ttf";$this->img = imagecreatetruecolor($this->width, $this->heigh);}//生成随机码private function createCode(){$_len = strlen($this->charset) - 1;for ($i = 0; $i < $this->codeLen; $i++) {$this->code .= $this->charset[mt_rand(0, $_len)];}}//生成背景private function createBg(){$color = imagecolorallocate($this->img, mt_rand(157, 255), mt_rand(157, 255), mt_rand(157, 255));imagefilledrectangle($this->img, 0, $this->heigh, $this->width, 0, $color);}//生成文字private function createFont(){$_x = $this->width / $this->codeLen;$_y = $this->heigh / 2;for ($i = 0; $i < $this->codeLen; $i++) {$color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));imagettftext($this->img, $this->fontsize, mt_rand(-30, 30), $_x * $i + mt_rand(3, 5), $_y + mt_rand(2, 4), $color, $this->font, $this->code[$i]);}}//生成线条,雪花private function createLine(){for ($i = 0; $i < 15; $i++) {$color = imagecolorallocate($this->img, mt_rand(0, 156), mt_rand(0, 156), mt_rand(0, 156));imageline($this->img, mt_rand(0, $this->width), mt_rand(0, $this->heigh), mt_rand(0, $this->width), mt_rand(0, $this->heigh), $color);}for ($i = 0; $i < 150; $i++) {$color = imagecolorallocate($this->img, mt_rand(200, 255), mt_rand(200, 255), mt_rand(200, 255));imagestring($this->img, mt_rand(1, 5), mt_rand(0, $this->width), mt_rand(0, $this->heigh), "#", $color);}}//输出图像private function outPut(){header("Content-Type: image/png");imagepng($this->img);imagedestroy($this->img);}//对外生成public function doImg(){$this->createBg(); //1.创建验证码背景$this->createCode();//2.生成随机码$this->createLine();//3.生成线条和雪花$this->createFont();//4.生成文字$this->outPut();//5.输出验证码图像}//获取验证码public function getCode(){return strtolower($this->code);}}4.测试
<?php/** * Created by PhpStorm. * User: andy * Date: 16-12-22 * Time: 下午1:20 */define("ROOT_PATH", dirname(__FILE__));require_once ROOT_PATH."/includes/ValidateCode.class.php";$_vc=new ValidateCode();echo $_vc->doImg();生成验证码:
<label><img src="../config/code.php" onclick="javascript:this.src="../config/code.php?tm="+Math.random();" /></label>上面onclick代码是点击验证码图片,能自动刷新验证码。
<?php/** * Created by PhpStorm. * User: andy * Date: 16-12-22 * Time: 下午3:43 */require substr(dirname(__FILE__),0,-7)."/init.inc.php";$_vc=new ValidateCode();echo $_vc->doImg();$_SESSION["ValidateCode"]=$_vc->getCode();有关应用的完整代码可以从https://git.oschina.net/andywww/myTest 的CMS1.0 文件里下载。