知识大全 php 验证码(倾斜,正弦干扰线,黏贴,旋转)
Posted 正弦
篇首语:寸阳分阴须爱惜,休负春色与时光。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 php 验证码(倾斜,正弦干扰线,黏贴,旋转)相关的知识,希望对你有一定的参考价值。
字体变型 (一般通过算法 进行扭曲 比较有代表性就是
字体黏贴 (这里面以qq验证码为代表了 目前网上还是很难找到 破解qq验证码的)
干扰线 噪点 (这种识别起来相当容易 很容易被程序自动化识别)
对于上面提到 第 二种方法 在识别时候 是比较困难的 个人比较喜欢第二种方法 感觉看起来不是很费力 而扭曲的文字 总觉得怪怪的 哈哈 纯粹个人喜好了
实现代码
<?php /** *带文字旋转 倾斜 黏贴 加正弦干扰线验证码* *@version *@author *@copyright 程默 QQ: */ class Utils_Caption var $Width = ; //图片宽 var $Height = ; //图片高 var $Length = ; //验证码位数 var $BgColor = "#FFFFFF"; //背景色 var $TFonts = array("font ttf"); var $TFontSize=array( ); //字体大小范围 var $TFontAngle=array( ); //旋转角度 var $Chars = " "; //验证码范围(字母数字) var $Code = array(); //验证码 var $Image = ""; //图形对象 var $FontColors=array( #f # bc # bd ); //字体颜色 红绿蓝 var $TPadden = ;///字符间距 多少个字符 var $Txbase = ;///x轴两边距离 var $Tybase = ;///y轴两边距离 var $TLine =true; ///画干扰线 public function RandRSI() ///生成验证码 $this >TFontAngle=range($this >TFontAngle[ ] $this >TFontAngle[ ]); $this >TFontSize=range($this >TFontSize[ ] $this >TFontSize[ ]); $arr=array(); $Chars=$this >Chars; $TFontAngle=$this >TFontAngle; $TFontSize=$this >TFontSize; $FontColors=$this >FontColors; $code=""; $font=dirname(__FILE__) "/font/" $this >TFonts[ ]; $charlen=strlen($Chars) ; $anglelen=count($TFontAngle) ; // 角度范围 $fontsizelen=count($TFontSize) ; // 角度范围 $fontcolorlen=count($FontColors) ; // 角度范围 for($i= ;$i<$this >Length;$i++) ///得到字符与颜色 $char=$Chars[rand( $charlen)]; ///得到字符 $angle=$TFontAngle[rand( $anglelen)]; ///旋转角度 $fontsize=$TFontSize[rand( $fontsizelen)]; ///字体大小 $fontcolor=$FontColors[rand( $fontcolorlen)]; ///字体大小 $bound=$this >_calculateTextBox($fontsize $angle $font $char); ///得到范围 $arr[]=array($fontsize $angle $fontcolor $char $font $bound); ///得到矩形框 $code =$char; $this >Code=$arr; //验证码 return $code; public function Draw() ///画图 if(empty($this >Code)) $this >RandRSI(); $codes=$this >Code; ///用户验证码 $wh=$this >_getImageWH($codes); $width=$wh[ ]; $height=$wh[ ]; ///高度 $this >Width=$width; $this >Height=$height; $this >Image = imageCreate( $width $height ); $image=$this >Image; $back = $this >_getColor ($this >_getColor( $this >BgColor)); ///背景颜色 imageFilledRectangle($image $width $height $back); ///填充背景 $TPadden=$this >TPadden; $basex=$this >Txbase; $color=null; foreach ($codes as $v) ///逐个画字符 $bound=$v[ ]; $color=$this >_getColor ($this >_getColor($v[ ])); imagettftext($image $v[ ] $v[ ] $basex $bound[ height ] $color $v[ ] $v[ ]); $basex=$basex+$bound[ width ]*$TPadden $bound[ left ];///计算下一个左边距 $this >TLine?$this >_wirteSinLine($color $basex):null; ///画干扰线 header("Content type: image/png"); imagepng( $image); imagedestroy($image); /** *通过字体角度得到字体矩形宽度* * * @param int $font_size 字体尺寸 * @param float $font_angle 旋转角度 * @param string $font_file 字体文件路径 * @param string $text 写入字符 * @return array 返回长宽高 */ private function _calculateTextBox($font_size $font_angle $font_file $text) $box = imagettfbbox($font_size $font_angle $font_file $text); $min_x = min(array($box[ ] $box[ ] $box[ ] $box[ ])); $max_x = max(array($box[ ] $box[ ] $box[ ] $box[ ])); $min_y = min(array($box[ ] $box[ ] $box[ ] $box[ ])); $max_y = max(array($box[ ] $box[ ] $box[ ] $box[ ])); return array( left => ($min_x >= ) ? abs($min_x + ) : abs($min_x + ) top => abs($min_y) width => $max_x $min_x height => $max_y $min_y box => $box ); private function _getColor( $color ) //#ffffff return array(hexdec($color[ ] $color[ ]) hexdec($color[ ] $color[ ]) hexdec($color[ ] $color[ ])); private function _getColor ( $color ) //#ffffff return imagecolorallocate ($this >Image $color[ ] $color[ ] $color[ ]); private function _getImageWH($data) $TPadden=$this >TPadden; $w=$this >Txbase; $h= ; foreach ($data as $v) $w=$w+$v[ ][ width ]*$TPadden $v[ ][ left ]; $h=$h>$v[ ][ height ]?$h:$v[ ][ height ]; return array(max($w $this >Width) max($h $this >Height)); //画正弦干扰线 private function _wirteSinLine($color $w) $img=$this >Image; $h=$this >Height; $h =rand( ); $h =rand( ); $w =rand( ); $h =rand( ); for($i= $w/ ;$i<$w/ ;$i=$i+ ) $y=$h/$h *sin($i/$w )+$h/ +$h ; imagesetpixel($img $i+$w/ $y $color); $h != ?imagesetpixel($img $i+$w/ $y+$h $color):null;
外带字体
font ttf 一个简单粗体文件
说明
先看下运行效果吧 大家也不要忙着复制运行了
……
主要特点是 旋转 然后黏贴 干扰线是线粗细可以变 然后正弦波形可以变化
比较复杂是 calculateTextBox 这个函数 这个是得到字符旋转后的宽度高度
demo:
cha138/Article/program/PHP/201311/21212$rsi = new Utils_Caption(); $rsi >TFontSize=array( ); $rsi >Width= ; $rsi >Height= ; $code = $rsi >RandRSI(); session_start(); $_SESSION["CHECKCODE"] = $code; $rsi >Draw();
相关参考
php仿QQ验证码的实例分析 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本文介绍一个php实现的
PHP简单验证码类:字母+数字字体随机扭曲 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 看了一
php代码复制代码代码如下:<?phpclassCaptcha_codevar$width=;var$num=;var$height=;var$name=randcode;publicfun
PHP5中GD库生成图形验证码(有汉字) 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本文为大家介
cha138/Article/program/PHP/201311/21348
JSP验证码大全之验证码使用与乱码解决 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 本文中介绍
下面一款代码是一个用asp生成图片验证码的程序哦关于验证代码写程序的大多都会知道哦下面来看看这款图片验证码的生成方式吧cha138/Article/program/net/201311/
kaptcha是一个简单好用的验证码生成工具通过配置可以自己定义验证码大小颜色显示的字符等等 下载kaptcha &
ASP.NET验证码技术 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 验证码技术是目前很多WE
ASP.NET做验证码 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 显示验证码的界面前台<