首页 > php图像处理 > php 中文汉字验证码生成程序

php 中文汉字验证码生成程序

这款关于php 中文汉字验证码生成程序其实很简单的,生成中文汉字验证码需要字体来支持了,下面我们用的arial.ttf来支持生成,否则生成中文图片验证码会出乱码的.

php 中文汉字验证码生成程序代码如下:

<?php
class securecode {
    private static $instance = null;
    private $code = '';
    private $fontfile;
    private $validate;
    private $image;
    private $specialadd = 'special string for securecode';
    private $codeexpire = 86400;
    private $codecookiename = 'secure_code';
    /** 
     * 构造方法
     */
    private function securecode() {
        $this->fontfile = dirname(__file__) . '/arial.ttf';
    }
    private function __construct() {
        $this->securecode();
    }
    public static function getinstance() {
        if (self::$instance == null) self::$instance = new self();
        return self::$instance;
    }
    /** 
     * 指定字体文件所在路径,默认为当前文件夹下arial.ttf文件
     * @param $fontfile 文件路径
     * @return void
     */
    function loadfont($fontfile) {
        $this->fontfile = $fontfile;
    }
    /** 
     * 图片输出方法,在执行本方法前程序不应该有任何形式的输出
     * @return void;
     */
    function stroke() {
        $this->savecode();
        self::sendheader();
        imagegif($this->validate);
        imagedestroy($this->validate);
        imagedestroy($this->image);
    }
    /** 
     * 图片保存方法
     * @param $filename 保存路径
     * @return void
     */
    function save($filename) {
        $this->savecode();
        imagegif($this->validate, $filename);
        imagedestroy($this->validate);
        imagedestroy($this->image);
    }
    /** 
     * 验证码验证方法
     * @param $input 要验证的字符串,即用户的输入内容
     * @return boolean 验证结果
     */
    function verify($input) {
        $input = strtolower($input);
        $targetcode = $this->authcode($input);
        $code = $this->getcookie();
        if (emptyempty($code) || $code != $targetcode) $result = false;
        else $result = true;
        $_cookie[$this->codecookiename] = '';
        setcookie($this->codecookiename, '', -1);
        return $result;
    }
    /** 
     * 图片创建方法
     * @return void;
     */
    function createimage() {
        $this->randcode();
        $size = 30;
        $width = 90;
        $height = 35;
        $degrees = array(
            rand(0, 30) ,
            rand(0, 30) ,
            rand(0, 30) ,
            rand(0, 30)
        );
        for ($i = 0; $i < 4; ++$i) {
            if (rand() % 2);
            else $degrees[$i] = - $degrees[$i];
        }
        $this->image = imagecreatetruecolor($size, $size);
        $this->validate = imagecreatetruecolor($width, $height);
        $back = imagecolorallocate($this->image, 255, 255, 255);
        $border = imagecolorallocate($this->image, 0, 0, 0);
        imagefilledrectangle($this->validate, 0, 0, $width, $height, $back);
        for ($i = 0; $i < 4; ++$i) {
            $temp = self::rgbtohsv(rand(0, 250) , rand(0, 150) , rand(0, 250));
            if ($temp[2] > 60) $temp[2] = 60;
            $temp = self::hsvtorgb($temp[0], $temp[1], $temp[2]);
            $textcolor[$i] = imagecolorallocate($this->image, $temp[0], $temp[1], $temp[2]);
        }
        for ($i = 0; $i < 200; ++$i) {
            $randpixelcolor = imagecolorallocate($this->validate, rand(0, 255) , rand(0, 255) , rand(0, 255));
            imagesetpixel($this->validate, rand(1, 87) , rand(1, 35) , $randpixelcolor);
        }
        $temp = self::rgbtohsv(rand(220, 255) , rand(220, 255) , rand(220, 255));
        if ($temp[2] < 200) $temp[2] = 255;
        $temp = self::hsvtorgb($temp[0], $temp[1], $temp[2]);
        $randlinecolor = imagecolorallocate($this->image, $temp[0], $temp[1], $temp[2]);
        self::imagelinethick($this->validate, $textcolor[rand(0, 3) ]);
        imagefilledrectangle($this->image, 0, 0, $size, $size, $back);
        putenv('gdfontpath=' . realpath('.'));
        // name the font to be used (note the lack of the .ttf extension
        imagettftext($this->image, 15, 0, 8, 20, $textcolor[0], $this->fontfile, $this->code[0]);
        $this->image = imagerotate($this->image, $degrees[0], $back);
        imagecolortransparent($this->image, $back);
        imagecopymerge($this->validate, $this->image, 1, 4, 4, 5, imagesx($this->image) - 10, imagesy($this->image) - 10, 100);
        $this->image = imagecreatetruecolor($size, $size);
        imagefilledrectangle($this->image, 0, 0, $size, $size, $back);
        imagettftext($this->image, 15, 0, 8, 20, $textcolor[1], $this->fontfile, $this->code[1]);
        $this->image = imagerotate($this->image, $degrees[1], $back);
        imagecolortransparent($this->image, $back);
        imagecopymerge($this->validate, $this->image, 21, 4, 4, 5, imagesx($this->image) - 10, imagesy($this->image) - 10, 100);
        $this->image = imagecreatetruecolor($size, $size);
        imagefilledrectangle($this->image, 0, 0, $size - 1, $size - 1, $back);
        imagettftext($this->image, 15, 0, 8, 20, $textcolor[2], $this->fontfile, $this->code[2]);
        $this->image = imagerotate($this->image, $degrees[2], $back);
        imagecolortransparent($this->image, $back);
        imagecopymerge($this->validate, $this->image, 41, 4, 4, 5, imagesx($this->image) - 10, imagesy($this->image) - 10, 100);
        $this->image = imagecreatetruecolor($size, $size);
        imagefilledrectangle($this->image, 0, 0, $size - 1, $size - 1, $back);
        imagettftext($this->image, 15, 0, 8, 20, $textcolor[3], $this->fontfile, $this->code[3]);
        $this->image = imagerotate($this->image, $degrees[3], $back);
        imagecolortransparent($this->image, $back);
        imagecopymerge($this->validate, $this->image, 61, 4, 4, 5, imagesx($this->image) - 10, imagesy($this->image) - 10, 100);
        imagerectangle($this->validate, 0, 0, $width - 1, $height - 1, $border);
    }
    //开源代码phprm.com
    
    /** 
     * 获取随机生成的验证码
     * @return string 随机验证码,返回的验证码不进行任何处理
     */
    function getcode() {
        return $this->code;
    }
    /** 
     * 生成随机码方法
     * @return void;
     */
    protected function randcode() {
        $alphastr = 'abcdefghijklmnpqrstuvwxyz123456789';
        $randstr = array(
            $alphastr{rand(0, 33) },
            $alphastr{rand(0, 33) },
            $alphastr{rand(0, 33) },
            $alphastr{rand(0, 33) }
        );
        $this->code = strtolower($randstr[0] . $randstr[1] . $randstr[2] . $randstr[3]);
    }
    /** 
     * rgb色到hsv色转变方法
     * @param $r
     * @param $g
     * @param $b
     * @return array hsv数组
     */
    protected static function rgbtohsv($r, $g, $b) {
        $tmp = min($r, $g);
        $min = min($tmp, $b);
        $tmp = max($r, $g);
        $max = max($tmp, $b);
        $v = $max;
        $delta = $max - $min;
        if ($max != 0) $s = $delta / $max; // s
        else {
            $s = 0;
            //$h = undefinedcolor;
            return;
        }
        if ($r == $max) $h = ($g - $b) / $delta; // between yellow & magenta
        else if ($g == $max) $h = 2 + ($b - $r) / $delta; // between cyan & yellow
        else $h = 4 + ($r - $g) / $delta; // between magenta & cyan
        $h*= 60; // degrees
        if ($h < 0) $h+= 360;
        return array(
            $h,
            $s,
            $v
        );
    }
    /** 
     * 同上一方法功能相反
     * @param $h
     * @param $s
     * @param $v
     * @return array rgb数组
     */
    protected static function hsvtorgb($h, $s, $v) {
        if ($s == 0) {
            // achromatic (grey)
            $r = $g = $b = $v;
            return;
        }
        $h/= 60; // sector 0 to 5
        $i = floor($h);
        $f = $h - $i; // factorial part of h
        $p = $v * (1 - $s);
        $q = $v * (1 - $s * $f);
        $t = $v * (1 - $s * (1 - $f));
        switch ($i) {
            case 0:
                $r = $v;
                $g = $t;
                $b = $p;
                break;
            case 1:
                $r = $q;
                $g = $v;
                $b = $p;
                break;
            case 2:
                $r = $p;
                $g = $v;
                $b = $t;
                break;
            case 3:
                $r = $p;
                $g = $q;
                $b = $v;
                break;
            case 4:
                $r = $t;
                $g = $p;
                $b = $v;
                break;
            default: // case 5:
                $r = $v;
                $g = $p;
                $b = $q;
                break;
        }
        return array(
            $r,
            $g,
            $b
        );
    }
    /** 
     使用cookie保存验证码的方法
     * @return void
     */
    protected function savecode() {
        $code = $this->authcode($this->code);
        $this->setcookie($code);
    }
    /** 
     * 验证码cookie值获取方法
     * @return string cookie值
     */
    protected function getcookie() {
        if (emptyempty($_cookie[$this->codecookiename])) {
            return '';
        } else {
            return addslashes($_cookie[$this->codecookiename]);
        }
    }
    /** 
     * 验证码cookie创建方法
     * @param string $code 要保存的验证码
     * @return void
     */
    protected function setcookie($code) {
        $expire = $this->codeexpire > 0 ? $this->codeexpire + time() : 0;
        setcookie($this->codecookiename, $code, $expire);
    }
    /** 
     * 验证码加密方法
     * @param string $code 要加密的随机码
     * @return mixed 执行结果
     */
    protected function authcode($code) {
        return md5($code . $this->specialadd);
    }
    /** 
     * 干扰线生成方法
     * @param resource $image 图片资源句柄
     * @param string $color 干扰线颜色
     */
    protected static function imagelinethick($image, $color) {
        $k = rand(5, 20);
        for ($px = 0; $px < 400; $px = $px + 1) {
            $y = $k * sin(0.1 * ($px)); //$y=200+10*sin(0.1*($px-200));
            for ($i = 0; $i < 2; $i++) {
                imagesetpixel($image, $px, $y + 10 + $i, $color);
            }
        }
    }
    /** 
     * http标头设置方法
     * @return void
     */
    protected static function sendheader() {
        header("pragma: no-cache");
        header("cache-control: max-age=1, s-maxage=1, no-cache, must-revalidate");
        header('content-type: image/gif');
    }
}


永久链接:http://www.phprm.com/tuxiang/fs4468.html

转载随意!带上文章地址吧。

标签:php验证码 php中文汉字

相关文章

发表留言