PHP生成帶有干擾線的驗證碼,干擾點、字符傾斜


PHP生成驗證碼的類代碼,本驗證碼類支持生成干擾點、干擾線等干擾像素,還可以使字符傾斜。在類中你可以定義驗證碼寬度、高度、長度、傾斜角度等參數,后附有用法:

<?php
class class_authcode{
    public  $authcode   = ''; //驗證碼
    private $width      = ''; //驗證碼圖片寬
    private $height     = ''; //驗證碼圖片高
    private $len        = ''; //驗證碼長度
    private $tilt       = array(-30,30);//驗證碼傾斜角度
    private $font       = 'AlteHaasGroteskBold.ttf';//字體文件
    private $str        = ''; //驗證碼基
    private $im         = ''; //生成圖片的句柄
    //構造函數
    function __construct($width=100,$heigh=30,$len=4) {
        $this->width    = $width;
        $this->height   = $heigh;
        $this->len      = $len;
        $this->str      = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
        $str_len = strlen($this->str)-1;
        for ($i=0; $i<$len; $i++) {
            $this->authcode .= $this->str[rand(0,$str_len)];
        }
    }
    //生成驗證碼圖片
    private function imagecreate(){
        $this->im = imagecreatetruecolor($this->width,$this->height);
    }
    //干擾顏色
    private function ext_color() {
        return imagecolorallocate($this->im,rand(50, 180),rand(50, 180),rand(50, 180));
    }
    //生成干擾點
    private function ext_point() {
        for ($i=0; $i<$this->width*2; $i++) {
            imagesetpixel($this->im,rand(1,$this->width-1),rand(1,$this->height-1),$this->ext_color());
        }
    }
    //生成干擾線
    private function ext_line() {
        for ($i=0; $i<$this->len; $i++) {
            $x1 = rand(1,$this->width-1);
            $y1 = rand(1,$this->height-1);
            $x2 = rand(1,$this->width-1);
            $y2 = rand(1,$this->height-1);
            imageline($this->im,$x1,$y1,$x2,$y2,$this->ext_color());
        }
    }
    //把驗證碼寫入圖片(不能和$this->imgstrfloat()同時使用)
    private function imgstr() {
        $old_x = 1;
        for ($i=0; $i<$this->len; $i++) {
            $fontsize = rand(2,5);      //字體大小
            $tmp_1 = $fontsize*2.5;
            $tmp_2 = $i>0  $tmp_1 : 0;
            $y = rand(1,$this->height/2);
            $x = rand($old_x+$tmp_2, ($i+1)*($this->width)/$this->len-$tmp_1);
            $old_x = $x;
            $color = imagecolorallocate($this->im,rand(200, 255),rand(200, 255),rand(200, 255));
            imagestring($this->im,$fontsize,$x,$y,$this->authcode[$i],$color);
        }
    }
    //把驗證碼傾斜寫入圖片(注意這里不能和$this->imgstr()方法同時使用)
    private function imgstrfloat() {
        $old_x = 1;
        for ($i=0; $i<$this->len; $i++) {
            $fontfloat = rand($this->tilt[0],$this->tilt[1]);
            $fontsize = rand(10,15);        //字體大小
            $tmp_1 = $i>0  $fontsize : 0;
            $y = rand($fontsize+2, $this->height-2);
            $x = rand($old_x+$tmp_1+2, ($i+1)*($this->width)/$this->len-$fontsize-2);
            $old_x = $x;
            $color = imagecolorallocate($this->im, rand(200, 255), rand(200, 255), rand(200, 255));
            imagettftext($this->im, $fontsize, $fontfloat, $x, $y, $color, $this->font, $this->authcode[$i]);
        }
    }
    //輸出驗證碼圖片
    function output() {
        $this->imagecreate();
        $this->imgstr();
        //$this->imgstrfloat();
        $this->ext_point();
        $this->ext_line();
        header('content-type:image/png');
        imagepng($this->im);
        imagedestroy($this->im);
    }
}
?>

本驗證碼用法說明:

$obj = new class_authcode();//實例化對象,並設置驗證碼圖片的寬、高和驗證碼的長度
$obj->$authcode; //獲取驗證碼
$obj->output(); //輸出驗證碼圖片

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM