zoukankan      html  css  js  c++  java
  • 把验证码和生成时间负值给$_SESSION[vCode]生成图像给浏览器

    php 图片 中文验证码

    <img src="verify_image.php" alt="点此刷新验证码" name="verify_code" width="65" height="20" border="0" id="verify_code" onclick="document.getElementById('verify_code').src='verify_image.php?'+Math.random();" style="cursor:pointer;" />

    <?php
    session_start();

    $vi = new vCodeImage;
    $vi->SetImage(1,4,65,20,80,1);

    class vCodeImage{
     var $mode;  //1:数字模式,2:字母模式,3:数字字母模式,其他:数字字母优化模式
     var $v_num;  //验证码个数
     var $img_w;  //验证码图像宽度
     var $img_h;  //验证码图像高度
     var $int_pixel_num;  //干扰像素个数
     var $int_line_num;  //干扰线条数
     var $font_dir;   //字体文件相对路径
     var $border;   //图像边框
     var $borderColor;  //图像边框颜色

     function SetImage($made,$v_num,$img_w,$img_h,$int_pixel_num,$int_line_num,$font_dir='../font',$border=true,$borderColor='255,200,85'){
      if(!isset($_SESSION['vCode'])){
       session_register('vCode');
      }
      $_SESSION['vCode']="";
      
      $this->mode = $made;
      $this->v_num = $v_num;
      $this->img_w = $img_w;
      $this->img_h = $img_h;
      $this->int_pixel_num = $int_pixel_num;
      $this->int_line_num = $int_line_num;
      $this->font_dir = $font_dir;
      $this->border = $border;
      $this->borderColor = $borderColor;
      $this->GenerateImage();
     }

     function GetChar($mode){
      if($mode == "1"){2881064151
       $ychar = "0,1,2,3,4,5,6,7,8,9";
      }
      else if($mode == "2"){
       $ychar = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
      }
      else if($mode == "3"){
       $ychar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
      }
      else
       $ychar = "3,4,5,6,7,8,9,A,B,C,D,H,K,P,R,S,T,W,X,Y";
      return $ychar;
     }
     
     function RandColor($rs,$re,$gs,$ge,$bs,$be){
      $r = mt_rand($rs,$re);
      $g = mt_rand($gs,$ge);
      $b = mt_rand($bs,$be);
      return array($r,$g,$b);
     }
     
     function GenerateImage(){
      $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);

      $fonts = ScanDir($this->font_dir);
      $fmax = count($fonts) - 2;

      $ychar = $this->GetChar($this->mode);
      $list = explode(",",$ychar);

      $x = mt_rand(2,$this->img_w/($this->v_num+2));
      $cmax = count($list) - 1;

      $v_code = '';

      for($i=0;$i<$this->v_num;$i++) //验证码
      {
       $randnum = mt_rand(0,$cmax);
       $this_char = $list[$randnum];
       $v_code .= $this_char;
       $size = mt_rand(intval($this->img_w/5),intval($this->img_w/4));
       $angle = mt_rand(-20,20);
       $y = mt_rand(($size+2),($this->img_h-2));
       if($this->border)
        $y = mt_rand(($size+3),($this->img_h-3));
       $rand_color = $this->RandColor(0,200,0,100,0,250);
       $randcolor = imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);
       $fontrand = mt_rand(2, $fmax);
       $font = "$this->font_dir/".$fonts[$fontrand];
       imagettftext($im, $size, $angle, $x, $y, $randcolor, $font, $this_char);
       $x = $x + intval($this->img_w/($this->v_num+1));
      }

      for($i=0;$i<$this->int_pixel_num;$i++){//干扰像素
       $rand_color = $this->RandColor(50,250,0,250,50,250);
       $rand_color_pixel = imagecolorallocate($im,$rand_color[0],$rand_color[1],$rand_color[2]);
       imagesetpixel($im, mt_rand()%$this->img_w, mt_rand()%$this->img_h, $rand_color_pixel);
      }

      for($i=0;$i<$this->int_line_num;$i++){ //干扰线
       $rand_color = $this->RandColor(0,250,0,250,0,250);
       $rand_color_line = 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(intval($this->img_w - ($this->img_w/3)),$this->img_w), mt_rand(0,$this->img_h), $rand_color_line);
      }

      if($this->border) //画出边框
      {
       if(preg_match("/^d{1,3},d{1,3},d{1,3}$/",$this->borderColor)){
        $borderColor = explode(',',$this->borderColor);
       }
       $border_color_line = imagecolorallocate($im,$borderColor[0],$borderColor[1],$borderColor[2]);
       imageline($im, 0, 0, $this->img_w, 0, $border_color_line); //上横
       imageline($im, 0, 0, 0, $this->img_h, $border_color_line); //左竖
       imageline($im, 0, $this->img_h-1, $this->img_w, $this->img_h-1, $border_color_line); //下横
       imageline($im, $this->img_w-1, 0, $this->img_w-1, $this->img_h, $border_color_line); //右竖
      }

      imageantialias($im,true); //抗锯齿

      $time = time();
      $_SESSION['vCode'] = $v_code."|".$time; //把验证码和生成时间负值给$_SESSION[vCode]

      //生成图像给浏览器
      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);
     }
    }
    ?>

  • 相关阅读:
    js创建map
    [POJ 1911] 棋盘
    [POJ 2176] Folding
    [POJ 1014] Dividing
    [洛谷P3486]POI2009 KON-Ticket Inspector
    [洛谷P1131] ZJOI2007 时态同步
    [洛谷P1133] 教主的花园
    [洛谷P1095]NOIP2007 普及组T3 守望者的逃离
    [POJ1187] 陨石的秘密
    [POJ1772] Substract
  • 原文地址:https://www.cnblogs.com/cbryge/p/6136587.html
Copyright © 2011-2022 走看看