当前位置:首页 > PHP教程 > php图像处理 > 列表

php 中文汉字验证码生成程序

发布:smiling 来源: PHP粉丝网  添加日期:2014-08-19 14:52:24 浏览: 评论:0 

这款关于php 中文汉字验证码生成程序其实很简单的,生成中文汉字验证码需要字体来支持了,下面我们用的arial.ttf来支持生成,否则生成中文图片验证码会出乱码的.

php 中文汉字验证码生成程序代码如下:

  1. class securecode 
  2.     private static $instance=null; 
  3.     private $code = ''
  4.     private $fontfile
  5.     private $validate
  6.     private $image
  7.     private $specialadd = 'special string for securecode'
  8.     private $codeexpire=86400; 
  9.     private $codecookiename='secure_code'
  10.  
  11.     /** 
  12.      * 构造方法 
  13.      */ 
  14.     private function securecode() 
  15.     { 
  16.         $this->fontfile = dirname( __file__ ) . '/arial.ttf'
  17.     } 
  18.  
  19.     private function __construct() 
  20.     { 
  21.         $this->securecode(); 
  22.     } 
  23.      
  24.     public static function getinstance() 
  25.     { 
  26.         if (self::$instance==null)  
  27.             self::$instance=new self(); 
  28.          
  29.         return self::$instance
  30.     } 
  31.  
  32.     /** 
  33.      * 指定字体文件所在路径,默认为当前文件夹下arial.ttf文件 
  34.      * @param $fontfile 文件路径 
  35.      * @return void 
  36.      */ 
  37.     function loadfont($fontfile
  38.     { 
  39.         $this->fontfile = $fontfile
  40.     } 
  41.  
  42.     /** 
  43.      * 图片输出方法,在执行本方法前程序不应该有任何形式的输出 
  44.      * @return void; 
  45.      */ 
  46.     function stroke() 
  47.     { 
  48.         $this->savecode(); 
  49.         self::sendheader(); 
  50.         imagegif( $this->validate ); 
  51.         imagedestroy( $this->validate ); 
  52.         imagedestroy( $this->image ); 
  53.     } 
  54.  
  55.     /** 
  56.      * 图片保存方法 
  57.      * @param $filename 保存路径 
  58.      * @return void 
  59.      */ 
  60.     function save($filename
  61.     { 
  62.         $this->savecode(); 
  63.         imagegif( $this->validate , $filename ); 
  64.         imagedestroy( $this->validate ); 
  65.         imagedestroy( $this->image ); 
  66.     } 
  67.      
  68.   /** 
  69.      * 验证码验证方法 
  70.      * @param $input 要验证的字符串,即用户的输入内容 
  71.      * @return boolean 验证结果 
  72.      */ 
  73.     function verify($input
  74.     { 
  75.         $input=strtolower($input); 
  76.         $targetcode=$this->authcode($input); 
  77.         $code=$this->getcookie(); 
  78.         if (emptyempty($code)||$code!=$targetcode)  
  79.             $result= false; 
  80.         else 
  81.             $result=true; 
  82.         $_cookie[$this->codecookiename]=''
  83.         setcookie ( $this->codecookiename, '', - 1 ); 
  84.         return $result
  85.     } 
  86.  
  87.     /** 
  88.      * 图片创建方法 
  89.      * @return void; 
  90.      */ 
  91.     function createimage() 
  92.     { 
  93.         $this->randcode(); 
  94.          
  95.         $size = 30; 
  96.         $width = 90; 
  97.         $height = 35; 
  98.         $degrees = array ( 
  99.             rand( 0 , 30 ), rand( 0 , 30 ), rand( 0 , 30 ), rand( 0 , 30 ) 
  100.         ); 
  101.         
  102.  
  103.         for ($i = 0; $i < 4; ++$i
  104.         { 
  105.             if (rand() % 2); 
  106.             else $degrees[$i] = -$degrees[$i]; 
  107.         } 
  108.          
  109.         $this->image = imagecreatetruecolor( $size , $size ); 
  110.         $this->validate = imagecreatetruecolor( $width , $height ); 
  111.         $back = imagecolorallocate( $this->image , 255 , 255 , 255 ); 
  112.         $border = imagecolorallocate( $this->image , 0 , 0 , 0 ); 
  113.         imagefilledrectangle( $this->validate , 0 , 0 , $width , $height , $back ); 
  114.          
  115.         for ($i = 0; $i < 4; ++$i
  116.         { 
  117.             $temp = self::rgbtohsv( rand( 0 , 250 ) , rand( 0 , 150 ) , rand( 0 , 250 ) ); 
  118.              
  119.             if ($temp[2] > 60) $temp[2] = 60; 
  120.              
  121.             $temp = self::hsvtorgb( $temp[0] , $temp[1] , $temp[2] ); 
  122.             $textcolor[$i] = imagecolorallocate( $this->image , $temp[0] , $temp[1] , $temp[2] ); 
  123.         } 
  124.          
  125.         for ($i = 0; $i < 200; ++$i
  126.         { 
  127.             $randpixelcolor = imagecolorallocate( $this->validate , rand( 0 , 255 ) , rand( 0 , 255 ) , rand( 0 , 255 ) ); 
  128.             imagesetpixel( $this->validate , rand( 1 , 87 ) , rand( 1 , 35 ) , $randpixelcolor ); 
  129.         } 
  130.          
  131.         $temp = self::rgbtohsv( rand( 220 , 255 ) , rand( 220 , 255 ) , rand( 220 , 255 ) ); 
  132.          
  133.         if ($temp[2] < 200) $temp[2] = 255; 
  134.          
  135.         $temp = self::hsvtorgb( $temp[0] , $temp[1] , $temp[2] ); 
  136.         $randlinecolor = imagecolorallocate( $this->image , $temp[0] , $temp[1] , $temp[2] ); 
  137.          
  138.         self::imagelinethick( $this->validate , $textcolor[rand( 0 , 3 )] ); 
  139.          
  140.         imagefilledrectangle( $this->image , 0 , 0 , $size , $size , $back ); 
  141.         putenv( 'gdfontpath=' . realpath'.' ) ); 
  142.          
  143.         // name the font to be used (note the lack of the .ttf extension 
  144.         imagettftext( $this->image , 15 , 0 , 8 , 20 , $textcolor[0] , $this->fontfile , $this->code[0] ); 
  145.          
  146.         $this->image = imagerotate( $this->image , $degrees[0] , $back ); 
  147.         imagecolortransparent( $this->image , $back ); 
  148.         imagecopymerge( $this->validate , $this->image , 1 , 4 , 4 , 5 , imagesx( $this->image ) - 10 , imagesy( $this->image ) - 10 , 100 ); 
  149.          
  150.         $this->image = imagecreatetruecolor( $size , $size ); 
  151.         imagefilledrectangle( $this->image , 0 , 0 , $size , $size , $back ); 
  152.         imagettftext( $this->image , 15 , 0 , 8 , 20 , $textcolor[1] , $this->fontfile , $this->code[1] ); 
  153.         $this->image = imagerotate( $this->image , $degrees[1] , $back ); 
  154.         imagecolortransparent( $this->image , $back ); 
  155.         imagecopymerge( $this->validate , $this->image , 21 , 4 , 4 , 5 , imagesx( $this->image ) - 10 , imagesy( $this->image ) - 10 , 100 ); 
  156.          
  157.         $this->image = imagecreatetruecolor( $size , $size ); 
  158.         imagefilledrectangle( $this->image , 0 , 0 , $size - 1 , $size - 1 , $back ); 
  159.         imagettftext( $this->image , 15 , 0 , 8 , 20 , $textcolor[2] , $this->fontfile , $this->code[2] ); 
  160.         $this->image = imagerotate( $this->image , $degrees[2] , $back ); 
  161.         imagecolortransparent( $this->image , $back ); 
  162.         imagecopymerge( $this->validate , $this->image , 41 , 4 , 4 , 5 , imagesx( $this->image ) - 10 , imagesy( $this->image ) - 10 , 100 ); 
  163.          
  164.         $this->image = imagecreatetruecolor( $size , $size ); 
  165.         imagefilledrectangle( $this->image , 0 , 0 , $size - 1 , $size - 1 , $back ); 
  166.         imagettftext( $this->image , 15 , 0 , 8 , 20 , $textcolor[3] , $this->fontfile , $this->code[3] ); 
  167.         $this->image = imagerotate( $this->image , $degrees[3] , $back ); 
  168.         imagecolortransparent( $this->image , $back ); 
  169.         imagecopymerge( $this->validate , $this->image , 61 , 4 , 4 , 5 , imagesx( $this->image ) - 10 , imagesy( $this->image ) - 10 , 100 ); 
  170.         imagerectangle( $this->validate , 0 , 0 , $width - 1 , $height - 1 , $border ); 
  171.     } 
  172. //开源代码phpfensi.com 
  173.  /** 
  174.      * 获取随机生成的验证码 
  175.      * @return string 随机验证码,返回的验证码不进行任何处理 
  176.      */ 
  177.   function getcode() 
  178.     { 
  179.         return $this->code; 
  180.     } 
  181.  
  182.     /** 
  183.      * 生成随机码方法 
  184.      * @return void; 
  185.      */ 
  186.     protected function randcode() 
  187.     { 
  188.         $alphastr = 'abcdefghijklmnpqrstuvwxyz123456789'
  189.         $randstr = array ( 
  190.             $alphastr{rand( 0 , 33 )}, $alphastr{rand( 0 , 33 )}, $alphastr{rand( 0 , 33 )}, $alphastr{rand( 0 , 33 )} 
  191.         ); 
  192.         $this->code = strtolower$randstr[0] . $randstr[1] . $randstr[2] . $randstr[3] ); 
  193.     } 
  194.  
  195.     /** 
  196.      * rgb色到hsv色转变方法 
  197.      * @param $r 
  198.      * @param $g 
  199.      * @param $b 
  200.      * @return array hsv数组 
  201.      */ 
  202.     protected static function rgbtohsv($r$g$b
  203.     { 
  204.         $tmp = min( $r , $g ); 
  205.         $min = min( $tmp , $b ); 
  206.         $tmp = max( $r , $g ); 
  207.         $max = max( $tmp , $b ); 
  208.         $v = $max
  209.         $delta = $max - $min
  210.          
  211.         if ($max != 0) $s = $delta / $max// s 
  212.         else 
  213.         { 
  214.             $s = 0; 
  215.             //$h = undefinedcolor; 
  216.             return
  217.         } 
  218.         if ($r == $max$h = ($g - $b) / $delta// between yellow & magenta 
  219.         else if ($g == $max$h = 2 + ($b - $r) / $delta// between cyan & yellow 
  220.         else $h = 4 + ($r - $g) / $delta// between magenta & cyan 
  221.         
  222.  
  223.  
  224.         $h *= 60; // degrees 
  225.         if ($h < 0) $h += 360; 
  226.         return array ( 
  227.             $h$s$v 
  228.         ); 
  229.     } 
  230.  
  231.     /** 
  232.      * 同上一方法功能相反 
  233.      * @param $h 
  234.      * @param $s 
  235.      * @param $v 
  236.      * @return array rgb数组 
  237.      */ 
  238.     protected static function hsvtorgb($h$s$v
  239.     { 
  240.         if ($s == 0) 
  241.         { 
  242.             // achromatic (grey) 
  243.             $r = $g = $b = $v
  244.             return
  245.         } 
  246.          
  247.         $h /= 60; // sector 0 to 5 
  248.         $i = floor$h ); 
  249.         $f = $h - $i// factorial part of h 
  250.         $p = $v * (1 - $s); 
  251.         $q = $v * (1 - $s * $f); 
  252.         $t = $v * (1 - $s * (1 - $f)); 
  253.          
  254.         switch ($i
  255.         { 
  256.             case 0 : 
  257.                 $r = $v
  258.                 $g = $t
  259.                 $b = $p
  260.                 break
  261.             case 1 : 
  262.                 $r = $q
  263.                 $g = $v
  264.                 $b = $p
  265.                 break
  266.             case 2 : 
  267.                 $r = $p
  268.                 $g = $v
  269.                 $b = $t
  270.                 break
  271.             case 3 : 
  272.                 $r = $p
  273.                 $g = $q
  274.                 $b = $v
  275.                 break
  276.             case 4 : 
  277.                 $r = $t
  278.                 $g = $p
  279.                 $b = $v
  280.                 break
  281.             default : // case 5: 
  282.                 $r = $v
  283.                 $g = $p
  284.                 $b = $q
  285.                 break
  286.         } 
  287.         return array ( 
  288.             $r$g$b 
  289.         ); 
  290.     } 
  291.  
  292.     /** 
  293.  
  294. 使用cookie保存验证码的方法 
  295.      * @return void 
  296.      */ 
  297.     protected function savecode() 
  298.     { 
  299.         $code = $this->authcode($this->code); 
  300.         $this->setcookie($code); 
  301.     } 
  302.  
  303.     /** 
  304.      * 验证码cookie值获取方法 
  305.      * @return string cookie值 
  306.      */ 
  307.     protected function getcookie() 
  308.     { 
  309.         if (emptyempty$_cookie[$this->codecookiename] )) 
  310.         { 
  311.             return ''
  312.         } 
  313.         else 
  314.         { 
  315.             return addslashes($_cookie[$this->codecookiename]); 
  316.         } 
  317.     } 
  318.      
  319.     /** 
  320.      * 验证码cookie创建方法 
  321.      * @param string $code 要保存的验证码 
  322.      * @return void 
  323.      */ 
  324.     protected function setcookie($code
  325.     { 
  326.         $expire = $this->codeexpire > 0 ? $this->codeexpire + time() : 0; 
  327.         setcookie( $this->codecookiename , $code$expire ); 
  328.     } 
  329.      
  330.     /** 
  331.      * 验证码加密方法 
  332.      * @param string $code 要加密的随机码 
  333.      * @return mixed 执行结果 
  334.      */ 
  335.     protected function authcode($code
  336.     { 
  337.         return md5($code.$this->specialadd); 
  338.     } 
  339.      
  340.     /** 
  341.      * 干扰线生成方法 
  342.      * @param resource $image 图片资源句柄 
  343.      * @param string $color 干扰线颜色 
  344.      */ 
  345.     protected static function imagelinethick($image$color
  346.     { 
  347.         $k = rand( 5 , 20 ); 
  348.         for ($px = 0; $px < 400; $px = $px + 1) 
  349.         { 
  350.             $y = $k * sin( 0.1 * ($px) ); //$y=200+10*sin(0.1*($px-200)); 
  351.             for ($i = 0; $i < 2; $i++) 
  352.             { 
  353.                 imagesetpixel( $image , $px , $y + 10 + $i , $color ); 
  354.             } 
  355.          
  356.         } 
  357.     } 
  358.  
  359.     /** 
  360.      * http标头设置方法 
  361.      * @return void 
  362.      */ 
  363.     protected static function sendheader() 
  364.     { 
  365.         header( "pragma: no-cache" ); 
  366.         header( "cache-control: max-age=1, s-maxage=1, no-cache, must-revalidate" ); 
  367.         header( 'content-type: image/gif' ); 
  368.     } 

Tags: php中文汉字 php验证码

分享到: