| 注册
请输入搜索内容

热门搜索

Java Linux MySQL PHP JavaScript Hibernate jQuery Nginx
程序猿123
10年前发布

基于GD库的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();  ?>