首页 > php图像处理 > php 图片中文验证码

php 图片中文验证码

<img src="verify_image.php" alt="点此刷新验证码" name="verify_code" width="65" height="20" border="0" id="verify_code" onclick="document.getElementById('verify_code').src='verify_image.php?'+Math.random();" style="cursor:pointer;" />
<?php
session_start();
$vi = new vCodeImage;
$vi->SetImage(1, 4, 65, 20, 80, 1);
class vCodeImage {
    var $mode; //1:数字模式,2:字母模式,3:数字字母模式,其他:数字字母优化模式
    var $v_num; //验证码个数
    var $img_w; //验证码图像宽度
    var $img_h; //验证码图像高度
    var $int_pixel_num; //干扰像素个数
    var $int_line_num; //干扰线条数
    var $font_dir; //字体文件相对路径
    var $border; //图像边框
    var $borderColor; //图像边框颜色
    function SetImage($made, $v_num, $img_w, $img_h, $int_pixel_num, $int_line_num, $font_dir = '../font', $border = true, $borderColor = '255,200,85') {
        if (!isset($_SESSION['vCode'])) {
            session_register('vCode');
        }
        $_SESSION['vCode'] = "";
        $this->mode = $made;
        $this->v_num = $v_num;
        $this->img_w = $img_w;
        $this->img_h = $img_h;
        $this->int_pixel_num = $int_pixel_num;
        $this->int_line_num = $int_line_num;
        $this->font_dir = $font_dir;
        $this->border = $border;
        $this->borderColor = $borderColor;
        $this->GenerateImage();
    }
    function GetChar($mode) {
        if ($mode == "1") {
            $ychar = "0,1,2,3,4,5,6,7,8,9";
        } else if ($mode == "2") {
            $ychar = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
        } else if ($mode == "3") {
            $ychar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
        } else $ychar = "3,4,5,6,7,8,9,A,B,C,D,H,K,P,R,S,T,W,X,Y";
        return $ychar;
    }
    function RandColor($rs, $re, $gs, $ge, $bs, $be) {
        $r = mt_rand($rs, $re);
        $g = mt_rand($gs, $ge);
        $b = mt_rand($bs, $be);
        return array(
            $r,
            $g,
            $b
        );
    }
    function GenerateImage() {
        $im = imagecreate($this->img_w, $this->img_h);
        $black = imagecolorallocate($im, 0, 0, 0);
        $white = imagecolorallocate($im, 255, 255, 255);
        $bgcolor = imagecolorallocate($im, 250, 250, 250);
        imagefill($im, 0, 0, $bgcolor);
        $fonts = ScanDir($this->font_dir);
        $fmax = count($fonts) - 2;
        $ychar = $this->GetChar($this->mode);
        $list = explode(",", $ychar);
        $x = mt_rand(2, $this->img_w / ($this->v_num + 2));
        $cmax = count($list) - 1;
        $v_code = '';
        for ($i = 0; $i < $this->v_num; $i++) //验证码
        {
            $randnum = mt_rand(0, $cmax);
            $this_char = $list[$randnum];
            $v_code.= $this_char;
            $size = mt_rand(intval($this->img_w / 5) , intval($this->img_w / 4));
            $angle = mt_rand(-20, 20);
            $y = mt_rand(($size + 2) , ($this->img_h - 2));
            if ($this->border) $y = mt_rand(($size + 3) , ($this->img_h - 3));
            $rand_color = $this->RandColor(0, 200, 0, 100, 0, 250);
            $randcolor = imagecolorallocate($im, $rand_color[0], $rand_color[1], $rand_color[2]);
            $fontrand = mt_rand(2, $fmax);
            $font = "$this->font_dir/" . $fonts[$fontrand];
            imagettftext($im, $size, $angle, $x, $y, $randcolor, $font, $this_char);
            $x = $x + intval($this->img_w / ($this->v_num + 1));
        }
        for ($i = 0; $i < $this->int_pixel_num; $i++) { //干扰像素
            $rand_color = $this->RandColor(50, 250, 0, 250, 50, 250);
            $rand_color_pixel = imagecolorallocate($im, $rand_color[0], $rand_color[1], $rand_color[2]);
            imagesetpixel($im, mt_rand() % $this->img_w, mt_rand() % $this->img_h, $rand_color_pixel);
        }
        for ($i = 0; $i < $this->int_line_num; $i++) { //干扰线
            $rand_color = $this->RandColor(0, 250, 0, 250, 0, 250);
            $rand_color_line = imagecolorallocate($im, $rand_color[0], $rand_color[1], $rand_color[2]);
            imageline($im, mt_rand(0, intval($this->img_w / 3)) , mt_rand(0, $this->img_h) , mt_rand(intval($this->img_w - ($this->img_w / 3)) , $this->img_w) , mt_rand(0, $this->img_h) , $rand_color_line);
        }
        if ($this->border) //画出边框
        {
            if (preg_match("/^d{1,3},d{1,3},d{1,3}$/", $this->borderColor)) {
                $borderColor = explode(',', $this->borderColor);
            }
            $border_color_line = imagecolorallocate($im, $borderColor[0], $borderColor[1], $borderColor[2]);
            imageline($im, 0, 0, $this->img_w, 0, $border_color_line); //上横
            imageline($im, 0, 0, 0, $this->img_h, $border_color_line); //左竖
            imageline($im, 0, $this->img_h - 1, $this->img_w, $this->img_h - 1, $border_color_line); //下横
            imageline($im, $this->img_w - 1, 0, $this->img_w - 1, $this->img_h, $border_color_line); //右竖
            
        }
        imageantialias($im, true); //抗锯齿
        $time = time();
        $_SESSION['vCode'] = $v_code . "|" . $time; //把验证码和生成时间负值给$_SESSION[vCode]
        //生成图像给浏览器
        if (function_exists("imagegif")) {
            header("Content-type: image/gif");
            imagegif($im);
        } elseif (function_exists("imagepng")) {
            header("Content-type: image/png");
            imagepng($im);
        } elseif (function_exists("imagejpeg")) {
            header("Content-type: image/jpeg");
            imagejpeg($im, "", 80);
        } elseif (function_exists("imagewbmp")) {
            header("Content-type: image/vnd.wap.wbmp");
            imagewbmp($im);
        } 
        else die("No Image Support On This Server !");
        imagedestroy($im);
    }
}


本文地址:http://www.phprm.com/tuxiang/fs4508.html

转载随意,但请附上文章地址:-)

标签:php中文验证码 php图片验证码

相关文章

发表留言