基于GD庫的php驗證碼類(支持中英文字體、背景、干擾點線、扭曲.......)

程序猿123 9年前發布 | 2K 次閱讀 PHP 驗證碼

<?php
/*

  • Captcha Class base on PHP GD Lib
  • @author Design
  • @version 1.0
  • @copyright js8.in 2010
  • @demo
  • include('captchaClass.php');
  • $captchaDemo=new Captcha();
  • $captchaDemo->createImage(); */ class Captcha { //@定義驗證碼圖片高度 private $height; //@定義驗證碼圖片寬度 private $width; //@定義驗證碼字符個數 private $textNum; //@定義驗證碼字符內容 private $textContent; //@定義字符顏色 private $fontColor; //@定義隨機出的文字顏色 private $randFontColor; //@定義字體大小 private $fontSize; //@定義字體 private $fontFamily; //@定義背景顏色 private $bgColor; //@定義隨機出的背景顏色 private $randBgColor; //@定義字符語言 private $textLang; //@定義干擾點數量 private $noisePoint; //@定義干擾線數量 private $noiseLine; //@定義是否扭曲 private $distortion; //@定義扭曲圖片源 private $distortionImage; //@定義是否有邊框 private $showBorder; //@定義驗證碼圖片源 private $image;

    //@Constructor 構造函數 public function Captcha() {

     $this->textNum    = 4;
     $this->fontSize   = 16;
     $this->fontFamily = 'c:\windows\fontsSIMYOU.ttf'; //設置中文字體,可以改成linux的目錄
     $this->textLang   = 'en';
     $this->noisePoint = 30;
     $this->noiseLine  = 3;
     $this->distortion = false;
     $this->showBorder = false;
    

    }

//@設置圖片寬度
public function setWidth($w)
{
    $this->width = $w;
}

//@設置圖片高度
public function setHeight($h)
{
    $this->height = $h;
}

//@設置字符個數
public function setTextNumber($textN)
{
    $this->textNum = $textN;
}

//@設置字符顏色
public function setFontColor($fc)
{
    $this->fontColor = sscanf($fc, '#%2x%2x%2x');
}

//@設置字號
public function setFontSize($n)
{
    $this->fontSize = $n;
}

//@設置字體
public function setFontFamily($ffUrl)
{
    $this->fontFamily = $ffUrl;
}

//@設置字符語言
public function setTextLang($lang)
{
    $this->textLang = $lang;
}

//@設置圖片背景
public function setBgColor($bc)
{
    $this->bgColor = sscanf($bc, '#%2x%2x%2x');
}

//@設置干擾點數量
public function setNoisePoint($n)
{
    $this->noisePoint = $n;
}

//@設置干擾線數量
public function setNoiseLine($n)
{
    $this->noiseLine = $n;
}

//@設置是否扭曲
public function setDistortion($b)
{
    $this->distortion = $b;
}

//@設置是否顯示邊框
public function setShowBorder($border)
{
    $this->showBorder = $border;
}

//@初始化驗證碼圖片
public function initImage()
{
    if (empty($this->width)) {
        $this->width = floor($this->fontSize * 1.3) * $this->textNum + 10;
    }
    if (empty($this->height)) {
        $this->height = $this->fontSize * 2;
    }
    $this->image = imagecreatetruecolor($this->width, $this->height);
    if (empty($this->bgColor)) {
        $this->randBgColor = imagecolorallocate($this->image, mt_rand(100, 255), mt_rand(100, 255), mt_rand(100, 255));
    } else {
        $this->randBgColor = imagecolorallocate($this->image, $this->bgColor[0], $this->bgColor[1], $this->bgColor[2]);
    }
    imagefill($this->image, 0, 0, $this->randBgColor);
}

//@產生隨機字符
public function randText($type)
{
    $string = '';
    switch ($type) {
        case 'en':
            $str = 'ABCDEFGHJKLMNPQRSTUVWXY3456789';
            for ($i = 0; $i < $this->textNum; $i++) {
                $string = $string . ',' . $str[mt_rand(0, 29)];
            }
            break;
        case 'cn':
            for ($i = 0; $i < $this->textNum; $i++) {
                $string = $string . ',' . chr(rand(0xB0, 0xCC)) . chr(rand(0xA1, 0xBB));
            }
            $string = iconv('GB2312', 'UTF-8', $string); //轉換編碼到utf8
            break;
    }
    return substr($string, 1);
}

//@輸出文字到驗證碼
public function createText()
{
    $textArray         = explode(',', $this->randText($this->textLang));
    $this->textContent = join('', $textArray);
    if (empty($this->fontColor)) {
        $this->randFontColor = imagecolorallocate($this->image, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100));
    } else {
        $this->randFontColor = imagecolorallocate($this->image, $this->fontColor[0], $this->fontColor[1], $this->fontColor[2]);
    }
    for ($i = 0; $i < $this->textNum; $i++) {
        $angle = mt_rand(-1, 1) * mt_rand(1, 20);
        imagettftext($this->image, $this->fontSize, $angle, 5 + $i * floor($this->fontSize * 1.3), floor($this->height * 0.75), $this->randFontColor, $this->fontFamily, $textArray[$i]);
    }
}

//@生成干擾點
public function createNoisePoint()
{
    for ($i = 0; $i < $this->noisePoint; $i++) {
        $pointColor = imagecolorallocate($this->image, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
        imagesetpixel($this->image, mt_rand(0, $this->width), mt_rand(0, $this->height), $pointColor);
    }

}

//@產生干擾線
public function createNoiseLine()
{
    for ($i = 0; $i < $this->noiseLine; $i++) {
        $lineColor = imagecolorallocate($this->image, mt_rand(0, 255), mt_rand(0, 255), 20);
        imageline($this->image, 0, mt_rand(0, $this->width), $this->width, mt_rand(0, $this->height), $lineColor);
    }
}

//@扭曲文字
public function distortionText()
{
    $this->distortionImage = imagecreatetruecolor($this->width, $this->height);
    imagefill($this->distortionImage, 0, 0, $this->randBgColor);
    for ($x = 0; $x < $this->width; $x++) {
        for ($y = 0; $y < $this->height; $y++) {
            $rgbColor = imagecolorat($this->image, $x, $y);
            imagesetpixel($this->distortionImage, (int) ($x + sin($y / $this->height * 2 * M_PI - M_PI * 0.5) * 3), $y, $rgbColor);
        }
    }
    $this->image = $this->distortionImage;
}

//@生成驗證碼圖片
public function createImage()
{
    $this->initImage(); //創建基本圖片
    $this->createText(); //輸出驗證碼字符
    if ($this->distortion) {
        $this->distortionText();
    } //扭曲文字
    $this->createNoisePoint(); //產生干擾點
    $this->createNoiseLine(); //產生干擾線
    if ($this->showBorder) {
        imagerectangle($this->image, 0, 0, $this->width - 1, $this->height - 1, $this->randFontColor);
    } //添加邊框
    imagepng($this->image);
    imagedestroy($this->image);
    if ($this->distortion) {
        imagedestroy($this->$distortionImage);
    }
    return $this->textContent;
}

} ?>

使用方法: <?php //session_start(); header("Content-type:image/png"); include('captcha5_class.php'); $captcha5 = new Captcha();

//@設置驗證碼寬度 //$captcha5->setWidth(200);

//@設置驗證碼高度 //$captcha5->setHeight(50);

//@設置字符個數 $captcha5->setTextNumber(5);

//@設置字符顏色 //$captcha5->setFontColor('#ff9900');

//@設置字號大小 //$captcha5->setFontSize(25);

//@設置字體 $captcha5->setFontFamily('c:\windows\fonts\STXINGKA.TTF');

//@設置語言 $captcha5->setTextLang('cn');

//@設置背景顏色 //$captcha5->setBgColor('#000000');

//@設置干擾點數量 //$captcha5->setNoisePoint(600);

//@設置干擾線數量 //$captcha5->setNoiseLine(10);

//@設置是否扭曲 //$captcha5->setDistortion(true);

//@設置是否顯示邊框 $captcha5->setShowBorder(true);

//輸出驗證碼 $code = $captcha5->createImage(); //$_SESSION['captchaCode']['content']=$code; //$_SESSION['captchaCode']['time']=microtime(); ?></pre>

 本文由用戶 程序猿123 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!