图形验证码实现(代码)

图形验证码类:

<?php
namespace app\common\services\captcha;
/** 验证码类* */

class ValidateCode {
    private $charset = 'abcdefghkmnprstuvwxyzABCDEFGHKMNPRSTUVWXYZ23456789';//随机因子
    private $code;//验证码
    private $codelen = 4;//验证码长度
    private $width = 100;//宽度
    private $height = 37;//高度
    private $img;//图形资源句柄
    private $font;//指定的字体
    private $fontsize = 28;//指定字体大小
    private $fontcolor;//指定字体颜色
    //构造方法初始化
    public function __construct( $path ) {
        $this->font = $path;//注意字体路径要写对,否则显示不了图片
    }
    //生成随机码
    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() {
        $this->img = imagecreatetruecolor($this->width, $this->height);
        $color = imagecolorallocate($this->img, 255, 255,255);
        imagefilledrectangle($this->img,0,$this->height,$this->width,0,$color);
    }
    //生成文字
    private function createFont() {
        $_x = $this->width / $this->codelen;
        for ($i=0;$i<$this->codelen;$i++) {
            $this->fontcolor = 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(1,5),$this->height / 1.4,$this->fontcolor,$this->font,$this->code[$i]);
        }
    }
    //生成线条、雪花
    private function createLine() {
        //线条
        for ($i=0;$i<6;$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->height),mt_rand(0,$this->width),mt_rand(0,$this->height),$color);
        }
        //雪花
        for ($i=0;$i<100;$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->height),'*',$color);
        }
    }
    //输出
    private function outPut() {
        header('Content-type:image/png');
        imagepng($this->img);
        imagedestroy($this->img);
    }
    //对外生成
    public function doimg() {
        $this->createBg();
        $this->createCode();
        //$this->createLine();
        $this->createFont();
        $this->outPut();
    }
    //获取验证码
    public function getCode() {
        return strtolower($this->code);
    }
}

实例:
基于Yii2框架

后端
<?php
namespace app\controllers
use use app\common\services\captcha\ValidateCode;
class DefaultController
{
    public function actionImg_captcha()
    {
       $font_path = \Yii::$app->getBasePath()."/web/fonts/captcha.ttf";//加载字体文件
        $captcha_handle = new ValidateCode( $font_path );//实例化验证码类
        $captcha_handle->doimg();//生成验证码
    }
}
前端
<img src="<?=/default/img_captcha"?>" onclick="this.src='/default/img_captcha?'+Math.random();"/>

猜你喜欢

转载自blog.csdn.net/Alan8865/article/details/80627012