+ -
当前位置:首页 → 问答吧 → 第一次写的验证码图片类!

第一次写的验证码图片类!

时间:2008-01-03

来源:互联网

我是在看了vsfree大侠的验证码类后为了学习改写的类,只能算做是整理吧!有不对的地方还请大学多指点指点!
原贴:http://bbs.phpchina.com/post.php?action=newthread&fid=72&extra=page%3D2
复制PHP内容到剪贴板
PHP代码:

<?php
/**
* @author Mpower

*/

class vCodeImg{
  var $v_mode;  //图片的模式
  var $v_num;   //验证码个数
  var $img_w;   //图片宽度
  var $img_h;   //图片高度
  var $border;  //是否显示边框
  var $bordercolor;    //边框的颜色
  var $pix_num;      //干扰像素的个数
  var $line_num;     //干扰线条的个数
  var $fontDir;     //字体存放的目录
  
  /**
  **@  构造函数
  */
  public function __construct($v_mode,$v_num,$img_w,$img_h,$pix_num,$line_num,$border,$bordercolor,$fontDir){
   $this->v_mode=$v_mode;
   $this->v_num=$v_num;
   $this->img_w=$img_w;
   $this->img_h=$img_h;
   $this->bordercolor=$bordercolor;
   $this->pix_num=$pix_num;
   $this->line_num=$line_num;
   $this->fontDir=$fontDir;
      $this->border=$border;
  }
  
  /**
  **生成验证码图片
  */
  public function setVimage(){
     session_start();        
     if(!isset($_SESSION['vCode'])){        
        session_register('vCode'); 
     }
     $_SESSION['vCode']='';
     
     $im=imagecreate($this->img_w,$this->img_h);     
     $black=imagecolorallocate($im,0,0,0);
     $white=imagecolorallocate($im,255,255,255); 
     $bgcolor=imagecolorallocate($im,250,250,250);    
     imagefill($im,0,0,$bgcolor);
     if($this->border){
         $this->drawBorder($im);
      }
     $outChar=$this->getRandChar();
     $time = time();
       $_SESSION['vCode']=$outChar."|".$time; //把验证码和生成时间负值给$_SESSION[vCode]
       
     $charX=mt_rand(2,$this->img_w/$this->v_num+2); //初始化第一个字符的X坐标
     for($i=0;$i<$this->v_num;$i++){
         $size=mt_rand(intval($this->img_w/($this->v_num+1)),intval($this->img_w/$this->v_num));
         $angle= mt_rand(-20,20);
         if($this->border){
         $charY=mt_rand(($size+3),($this->img_h-3));  //字符的Y轴坐标
       }else{
      $charY=mt_rand(($size+2),($this->img_h-2)); 
    }
    $fRandColor=$this->getRandColor(0,200,0,255,0,250);
    $fColor=imagecolorallocate($im,$fRandColor[0],$fRandColor[1],$fRandColor[2]);
                $font=$this->getFonts();
                imagettftext($im,$size,$angle,$charX,$charY,$fColor,$font,$outChar[$i]);
                $charX+=intval($this->img_w/$this->v_num+2);
     }     
     
     $this->addPix($im);
     $this->addLine($im);
     imageantialias($im,true);
     
     $this->outImg($im);     
  }
  
  /**
     **@得到验证码上输出的图片
     ***参数:1:只输出数字|2:只输出字母|3:数字个字母混合输出|默认为只输出字母
  */
  private function getChar(){
   switch($this->v_mode){
    case 1:
      $outChar='0123456789';
      break;
    case 2:
      $outChar='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
      break;
    case 3:
      $outChar='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
      break;
    default:
      $outChar='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
      break;
   }
   return $outChar;   
  }
  
        /**
        **@获得随机颜色
  **$rl:为红色最小值|$rm为红色最大值|$gl为绿色最小值|$gm为绿色最大值|$bl为蓝色最小值|$bm为蓝色最大值 
  */
  private function getRandColor($rl,$rm,$gl,$gm,$bl,$bm){
   $r=mt_rand($rl,$rm);
   $g=mt_rand($gl,$gm);
   $b=mt_rand($bl,$bm);
      return array($r,$g,$b); 
  }
  
  /**
  **@获得随机验证码
  */
  private function getRandChar(){
   $outChar=$this->getChar($this->mode);
   $v_count=strlen($outChar)-1;
   for($i=0;$i<$this->v_num;$i++){
    $vi=mt_rand(0,$v_count);
    $randChar.=$outChar[$vi];
   }
   return $randChar;   
  }
  
  /**
  **@产生干扰像素
  ***$im参数为图片
  */
  private function addPix($im){
     for($i=0;$i<$this->pix_num;$i++){
     $rand_color=$this->getRandColor(50,250,0,250,50,250);
     $pix_color=imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);
     imagesetpixel($im,mt_rand()%$this->img_w,mt_rand()%$this->img_h,$pix_color);
     }
  }
  
  /**
  **@产生干扰线条
  ***$im参数为图片
  */
  private function addLine($im){
   for($i=0;$i<$this->line_num;$i++){
      $rand_color=$this->getRandColor(50,250,0,250,50,250);
      $lin_color=imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);
      imageline($im,mt_rand(0,intval($this->img_w/3)),mt_rand(0,$this->img_h),mt_rand(0,intval($this->img_w)),intval(mt_rand(0,$this->img_h)),$lin_color);
   }
  }
  
  /**
  **边框的颜色
  **$im为图像参数
  */
  private function drawBorder($im){
   if(preg_match("/^\d{1,3},\d{1,3},\d{1,3}$/",$this->bordercolor)){
       $bcolor=explode(',',$this->bordercolor);
   }
   $lcolor=imagecolorallocate($im,$bcolor[0],$bcolor[1],$bcolor[2]);
   //画边框的顺序为顺时针方向
   imageline($im,0,0,$this->img_w,0,$lcolor);
   imageline($im,$this->img_w-1,0,$this->img_w-1,$this->img_h,$lcolor);
   imageline($im,0,$this->img_h-1,$this->img_w,$this->img_h-1,$lcolor);
   imageline($im,0,0,0,$this->img_h-1,$lcolor);
  }
  
  /**
  **@获得字体
  **并随机返回其中一个随机的字体
  */
  private function getFonts(){
     $fontName=scandir($this->fontDir);
     $fontNum=count($fontName)-2;
     $font=mt_rand(2,($fontNum+2));
     return "$this->fontDir/".$fontName[$font];   
  }
  
  /**
  **生成图像
  */
  private function outImg($im){
   if (function_exists("imagegif")) {
         header ("Content-type: image/gif");
         imagegif($im);
     }
     elseif (function_exists("imagepng")) {
         header ("Content-type: image/png");
         imagepng($im);
     }
     elseif (function_exists("imagejpeg")) {
         header ("Content-type: image/jpeg");
         imagejpeg($im, "", 80);
     }
     elseif (function_exists("imagewbmp")) {
         header ("Content-type: image/vnd.wap.wbmp");
        imagewbmp($im);
     }
     else
        die("No Image Support On This Server !");

     imagedestroy($im);
  }
  
  


//初始设置
$v_mode=2;  //图片的模式
$v_num=4;   //验证码个数
$img_w=100;   //图片宽度
$img_h=25;   //图片高度
$border=1;   //是否显示边框
$bordercolor='255,200,85';    //边框的颜色
$pix_num=50;      //干扰像素的个数
$line_num=5;     //干扰线条的个数
$f;
$test=new vCodeImg($v_mode,$v_num,$img_w,$img_h,$pix_num,$line_num,$border,$bordercolor,$fontDir);
$test->setVimage();

在页面中调用:
复制PHP内容到剪贴板
PHP代码:

<?php
  session_start();
?>
<img src="verify_image.php" alt="点此刷新验证码" name="verify_code" border="0" id="verify_code"  style="cursor:pointer;" />
另外估计是默认session全局是关闭的,所以在调用的页面也要加上"session_start()",要不然可能读不到session的值

[ 本帖最后由 Mpower 于 2008-1-2 17:46 编辑 ]

作者: Mpower   发布时间: 2008-01-02



有第一次肯定有第二次.
不错不错.继续努力

作者: 逆雪寒   发布时间: 2008-01-02

一个函数就可以了嘛

作者: fnet   发布时间: 2008-01-02

继续努力

作者: luzhou   发布时间: 2008-01-04