提取自yii的验证码类

 提示:转载请注明原文链接

 本文永久链接:https://360us.net/article/6.html

实例化类,然后调用类run()方法,即可生成默认的验证码图片,验证码图片是根据.ttf的字体文件生成的,所以必须要有字体文件,字体文件和类同级目录,要更改默认设置可以实例化类是传入参数、值的数组。

调用getVerifyCode()方法会返回生成的验证码字符串。

修改字体在219行。

<?php

class MyCaptchaAction {

    /**

    * @var integer the width of the generated CAPTCHA image. Defaults to 120.
    * 图片宽度,默认120

    */

    public $width = 120;

    /**

    * @var integer the height of the generated CAPTCHA image. Defaults to 50.
    * 图片高度,默认50

    */

    public $height = 50;

    /**

    * @var integer padding around the text. Defaults to 2.
    * 图片内边距,默认2

    */

    public $padding = 2;

    /**

    * @var integer the background color. For example, 0x55FF00.

    * Defaults to 0xFFFFFF, meaning white color.
    * 背景色,默认白色

    */

    public $backColor = 0xFFFFFF;

    /**

    * @var integer the font color. For example, 0x55FF00. Defaults to 0x2040A0 (blue color).
    * 字体颜色,默认蓝色

    */

    public $foreColor = 0x2040A0;

    /**

    * @var boolean whether to use transparent background. Defaults to false.
    * 是否背景透明,默认否

    */

    public $transparent = false;

   /**

   * @var integer the minimum length for randomly generated word. Defaults to 6.
   * 验证码字符串最小长度,默认6
   */

    public $minLength = 6;

    /**

    * @var integer the maximum length for randomly generated word. Defaults to 7.
    * 验证码字符串最大长度,默认7

    */

    public $maxLength = 7;

    /**

    * @var integer the offset between characters. Defaults to -2. You can adjust this property

    * in order to decrease or increase the readability of the captcha.

    * @since 1.1.7
    * 字符间偏移量

    **/

    public $offset = -2;

    /**

    * @var string the TrueType font file. Defaults to Duality.ttf which is provided

    * with the Yii release.
    * 字体文件,默认是Duality.ttf,字体文件和类文件同级目录。

    */

    public $fontFile;

    /**
    * 构造函数,类属性可以通过这里初始化,传入数组的方式,
    */
    public function __construct($params){

        foreach ($params as $key => $value){

            $this->$key = $value;

        }

    }
    /**
    * 获取产生的验证码字符串
    */
    public function getVerifyCode(){

        return $this->generateVerifyCode();

    }
    /**
    * 实例化类之后,调用此方法生存验证码图片
    */
    public function run(){

        $this->renderImageGD($this->getVerifyCode());

    }

    /**

    * Generates a new verification code.

    * @return string the generated verification code

    */

    protected function generateVerifyCode()

    {

        if($this->minLength < 3)

        $this->minLength = 3;

        if($this->maxLength > 20)

        $this->maxLength = 20;

        if($this->minLength > $this->maxLength)

        $this->maxLength = $this->minLength;

        $length = mt_rand($this->minLength,$this->maxLength);

        $letters = '0123456789abcdefghijklmnopqrstuvwxyz';

        $code = '';

        for($i = 0; $i < $length; ++$i)

        {

            $code.=$letters{mt_rand(0,34)};

        }

        return $code;

    }

    /**

    * Renders the CAPTCHA image based on the code using GD library.

    * @param string $code the verification code

    * @since 1.1.13

    */

    protected function renderImageGD($code)

    {

        $image = imagecreatetruecolor($this->width,$this->height);

        //分配颜色

        $backColor = imagecolorallocate($image,

                     (int)($this->backColor % 0x1000000 / 0x10000),

                     (int)($this->backColor % 0x10000 / 0x100),

        $this->backColor % 0x100);

        imagefilledrectangle($image,0,0,$this->width,$this->height,$backColor);

        //取消之前分配的颜色

        imagecolordeallocate($image,$backColor);

        if($this->transparent)

        imagecolortransparent($image,$backColor);

        $foreColor = imagecolorallocate($image,

                     (int)($this->foreColor % 0x1000000 / 0x10000),

                     (int)($this->foreColor % 0x10000 / 0x100),

        $this->foreColor % 0x100);

        if($this->fontFile === null)

                $this->fontFile = dirname(__FILE__) . '/Duality.ttf';  //默认的字体文件,Yii框架自带的

        $length = strlen($code);

        $box = imagettfbbox(30,0,$this->fontFile,$code);

        $w = $box[4] - $box[0] + $this->offset * ($length - 1);

        $h = $box[1] - $box[5];

        $scale = min(($this->width - $this->padding * 2) / $w,($this->height - $this->padding * 2) / $h);

        $x = 10;

        $y = round($this->height * 27 / 40);

        for($i = 0; $i < $length; ++$i)

        {

                $fontSize = (int)(rand(26,32) * $scale * 0.8);

                $angle = rand(-10,10);

                $letter = $code[$i];

                $box = imagettftext($image,$fontSize,$angle,$x,$y,$foreColor,$this->fontFile,$letter);

                $x = $box[2] + $this->offset;

        }

        imagecolordeallocate($image,$foreColor);

        header('Pragma: public');

        header('Expires: 0');

        header('Cache-Control: must-revalidate, post-check=0, pre-check=0');

        header('Content-Transfer-Encoding: binary');

        header("Content-type: image/png");

        imagepng($image);

        imagedestroy($image);

        }

}


 评论
昵称
邮箱
网址
最多500个字符