PHP实现生成带背景的图形验证码功能


Posted in PHP onOctober 03, 2016

本文实例讲述了PHP实现生成带背景的图形验证码功能。分享给大家供大家参考,具体如下:

以前我们利用php生成的都是无背景或同一色彩背景的验证码了,但这种验证容易给机器识别了,这里就来介绍一些生成带背景的图形验证码实例.

1、产生一张png的图片,
2、为图片设置背景色,
3、设置字体颜色和样式,
4、产生4位数的随机的验证码,
5、把产生的每个字符调整旋转角度和位置画到png图片上,
6、加入噪点和干扰线防止注册机器分析原图片来恶意注册,
7、输出图片,
8、释放图片所占内存

authcode.php文件,代码如下:

<?php
    session_start ();
    header ( 'Content-type: image/png' );
    //创建图片
    $im = imagecreate($x=130,$y=45 );
    $bg = imagecolorallocate($im,rand(50,200),rand(0,155),rand(0,155)); //第一次对 imagecolorallocate() 的调用会给基于调色板的图像填充背景色
    $fontColor = imageColorAllocate ( $im, 255, 255, 255 );  //字体颜色
    $fontstyle = 'rock.ttf';          //字体样式,这个可以从c:windowsFonts文件夹下找到,我把它放到和authcode.php文件同一个目录,这里可以替换其他的字体样式
    //产生随机字符
    for($i = 0; $i < 4; $i ++) {
        $randAsciiNumArray     = array (rand(48,57),rand(65,90));
        $randAsciiNum         = $randAsciiNumArray [rand ( 0, 1 )];
        $randStr             = chr ( $randAsciiNum );
        imagettftext($im,30,rand(0,20)-rand(0,25),5+$i*30,rand(30,35),$fontColor,$fontstyle,$randStr);
        $authcode            .= $randStr;
    }
    $_SESSION['authcode']    = $randFourStr;//用户和用户输入的验证码做比较
    //干扰线
    for ($i=0;$i<8;$i++){
        $lineColor    = imagecolorallocate($im,rand(0,255),rand(0,255),rand(0,255));
        imageline ($im,rand(0,$x),0,rand(0,$x),$y,$lineColor);
    }
    //干扰点
    for ($i=0;$i<250;$i++){
        imagesetpixel($im,rand(0,$x),rand(0,$y),$fontColor);
    }
    imagepng($im);
    imagedestroy($im);
?>

例2,新建一个PHP文件captcha_code_file.php,代码如下:

//首先开启session
session_start();
//定义前台显示验证码长&宽
$image_width = 120;
$image_height = 40;
$characters_on_image = 6;
$font = './monofont.ttf';
//The characters that can be used in the CAPTCHA code.
//avoid confusing characters (l 1 and i for example)
$possible_letters = '23456789bcdfghjkmnpqrstvwxyz';
$random_dots = 10;
$random_lines = 30;
$captcha_text_color="0x142864";
$captcha_noice_color = "0x142864";
//定义要生成验证码的字符串
$code = '';
$i = 0;
while ($i < $characters_on_image) {
$code .= substr($possible_letters, mt_rand(0, strlen($possible_letters)-1), 1);
$i++;
}
$font_size = $image_height * 0.75;
$image = @imagecreate($image_width, $image_height);
/* setting the background, text and noise colours here */
$background_color = imagecolorallocate($image, 255, 255, 255);
$arr_text_color = hexrgb($captcha_text_color);
$text_color = imagecolorallocate($image, $arr_text_color['red'],
    $arr_text_color['green'], $arr_text_color['blue']);
$arr_noice_color = hexrgb($captcha_noice_color);
$image_noise_color = imagecolorallocate($image, $arr_noice_color['red'],
    $arr_noice_color['green'], $arr_noice_color['blue']);
/* generating the dots randomly in background */
for( $i=0; $i<$random_dots; $i++ ) {
imagefilledellipse($image, mt_rand(0,$image_width),
 mt_rand(0,$image_height), 2, 3, $image_noise_color);
}
/* generating lines randomly in background of image */
for( $i=0; $i<$random_lines; $i++ ) {
imageline($image, mt_rand(0,$image_width), mt_rand(0,$image_height),
 mt_rand(0,$image_width), mt_rand(0,$image_height), $image_noise_color);
}
/* create a text box and add 6 letters code in it */
$textbox = imagettfbbox($font_size, 0, $font, $code);
$x = ($image_width - $textbox[4])/2;
$y = ($image_height - $textbox[5])/2;
imagettftext($image, $font_size, 0, $x, $y, $text_color, $font , $code);
/* Show captcha image in the page html page */
header('Content-Type: image/jpeg');// defining the image type to be shown in browser widow
imagejpeg($image);//showing the image
imagedestroy($image);//destroying the image instance
//设置session,做验证
$_SESSION['6_letters_code'] = $code;
function hexrgb ($hexstr)
{
 $int = hexdec($hexstr);
 return array("red" => 0xFF & ($int >> 0x10),
        "green" => 0xFF & ($int >> 0x8),
        "blue" => 0xFF & $int);
}

显示验证码页面index.php,实例代码如下:

<?php
session_start();
if(isset($_REQUEST['Submit'])){
  // code for check server side validation
  if(emptyempty($_SESSION['6_letters_code'] ) ||
    strcasecmp($_SESSION['6_letters_code'], $_POST['6_letters_code']) != 0)
  {
    $msg="您输入的验证码有误,请重新输入!";
  }else{
    echo "您输入的是正确的!";
    // Captcha verification is Correct. Final Code Execute here!
  }
}
?>
<style type="text/css">
.table{
  font-family:Arial, Helvetica, sans-serif;
  font-size:12px;
  color:#333;
  background-color:#E4E4E4;
}
.table td{
  background-color:#F8F8F8;
}
</style>
<form action="" method="post" name="form1" id="form1" >
 <table width="400" border="0" align="center" cellpadding="5" cellspacing="1">
<?php if(isset($msg)){?>
  <tr>
   <td colspan="2" align="center" valign="top"><?php echo $msg;?></td>
  </tr>
<?php } ?>
  <tr>
   <td align="right" valign="top"> 验证码Demo:</td>
   <td><img src="captcha_code_file.php?rand=<?php echo rand(0,20);?>" id='captchaimg' onclick="refreshCaptcha();" ><br>
    <label for='message'>请输入验证码:</label>
    <br>
    <input id="6_letters_code" name="6_letters_code" type="text">
    <br>
    如果看不到,请 <a href='javascript: refreshCaptcha();'>点我</a> 刷新一下!
    </p></td>
  </tr>
  <tr>
   <td>&nbsp;</td>
   <td><input name="Submit" type="submit" onclick="return validate();" value="Submit"></td>
  </tr>
 </table>
</form>
<script type='text/javascript'>
//定义的刷新请求
function refreshCaptcha()
{
  var img = document.images['captchaimg'];
  img.src = img.src.substring(0,img.src.lastIndexOf("?"))+"?rand="+Math.random()*1000;
}
</script>

例3,带有雪花背景的验证码,代码如下:

<?session_start();?>
<FORM METHOD=POST ACTION="">
<input type=text name=number maxlength=4><img src="YanZhengMa.php?act=init">
<INPUT TYPE="submit" name="sub">
</FORM>
<?
//检验校验码
if(isset($HTTP_POST_VARS["sub"])):
if($HTTP_POST_VARS["number"] != $HTTP_SESSION_VARS[login_check_number] || emptyempty($HTTP_POST_VARS["number"])){
  echo "校验码不正确!" ;
}else{
  echo"验证码通过!";
}
endif;
show_source('test.php');
//以上本页的源码
//以下是生成验证码的源码
show_source('YanZhengMa.php');
?>
<?php
session_start();
session_register("login_check_number");
//昨晚看到了chianren上的验证码效果,就考虑了一下,用PHP的GD库完成了类似功能
//先成生背景,再把生成的验证码放上去
$img_height=120;  //先定义图片的长、宽
$img_width=40;
if($HTTP_GET_VARS["act"]== "init"){
  //srand(microtime() * 100000);//PHP420后,srand不是必须的
  for($Tmpa=0;$Tmpa<4;$Tmpa++){
    $nmsg.=dechex(rand(0,15));
  }//by sports98
  $HTTP_SESSION_VARS[login_check_number] = $nmsg;
  //$HTTP_SESSION_VARS[login_check_number] = strval(mt_rand("1111","9999"));  //生成4位的随机数,放入session中
  //谁能做下补充,可以同时生成字母和数字啊??----由sports98完成了
  $aimg = imageCreate($img_height,$img_width);  //生成图片
  ImageColorAllocate($aimg, 255,255,255);      //图片底色,ImageColorAllocate第1次定义颜色PHP就认为是底色了
  $black = ImageColorAllocate($aimg, 0,0,0);    //定义需要的黑色
  ImageRectangle($aimg,0,0,$img_height-1,$img_width-1,$black);//先成一黑色的矩形把图片包围
  //下面该生成雪花背景了,其实就是在图片上生成一些符号
  for ($i=1; $i<=100; $i++) {  //先用100个做测试
    imageString($aimg,1,mt_rand(1,$img_height),mt_rand(1,$img_width),"*",imageColorAllocate($aimg,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));
    //哈,看到了吧,其实也不是雪花,就是生成*号而已。为了使它们看起来"杂乱无章、5颜6色",就得在1个1个生成它们的时候,让它们的位置、颜色,甚至大小都用随机数,rand()或mt_rand都可以完成。
  }
  //上面生成了背景,现在就该把已经生成的随机数放上来了。道理和上面差不多,随机数1个1个地放,同时让他们的位置、大小、颜色都用成随机数~~
  //为了区别于背景,这里的颜色不超过200,上面的不小于200
  for ($i=0;$i<strlen($HTTP_SESSION_VARS[login_check_number]);$i++){
    imageString($aimg, mt_rand(3,5),$i*$img_height/4+mt_rand(1,10),mt_rand(1,$img_width/2), $HTTP_SESSION_VARS[login_check_number][$i],imageColorAllocate($aimg,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200)));
  }
  Header("Content-type: image/png");  //告诉浏览器,下面的数据是图片,而不要按文字显示
  ImagePng($aimg);          //生成png格式。。。嘿嘿效果蛮像回事的嘛。。。
  ImageDestroy($aimg);
}
?>

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
建站常用13种PHP开源CMS比较
Aug 23 PHP
PHP中删除变量时unset()和null的区别分析
Jan 27 PHP
php操作JSON格式数据的实现代码
Dec 24 PHP
PHP输出时间差函数代码
Jan 28 PHP
php单一接口的实现方法
Jun 20 PHP
thinkPHP2.1自定义标签库的导入方法详解
Jul 20 PHP
PHP 获取指定地区的天气实例代码
Feb 08 PHP
Yii2数据库操作常用方法小结
May 04 PHP
Laravel事件监听器用法实例分析
Mar 12 PHP
解决Laravel无法使用COOKIE和SESSION的问题
Oct 16 PHP
YII2框架中ActiveDataProvider与GridView的配合使用操作示例
Mar 18 PHP
PHP中的异常处理机制深入讲解
Nov 10 PHP
php使用CutyCapt实现网页截图保存的方法
Oct 03 #PHP
php+mysql查询实现无限下级分类树输出示例
Oct 03 #PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 #PHP
PHP读MYSQL中文乱码的快速解决方法
Oct 01 #PHP
php简单统计中文个数的方法
Sep 30 #PHP
php简单实现多维数组排序的方法
Sep 30 #PHP
thinkphp在php7环境下提示Cannot use ‘String’ as class name as it is reserved的解决方法
Sep 30 #PHP
You might like
php实现从ftp服务器上下载文件树到本地电脑的程序
2009/02/10 PHP
PHP 防注入函数(格式化数据)
2011/08/08 PHP
php处理restful请求的路由类分享
2014/02/27 PHP
PHP实现微信网页授权开发教程
2016/01/19 PHP
laravel框架模板之公共模板、继承、包含实现方法分析
2019/08/30 PHP
11款基于Javascript的文件管理器
2009/10/25 Javascript
js jquery数组介绍
2012/07/15 Javascript
jquery的ajax()函数传值中文乱码解决方法介绍
2012/11/08 Javascript
JavaScript实现班级随机点名小应用需求的具体分析
2014/05/12 Javascript
JavaScript中两个字符串的匹配
2016/06/08 Javascript
JavaScript实战之带收放动画效果的导航菜单
2016/08/16 Javascript
js实现右键菜单功能
2016/11/28 Javascript
Vuex模块化实现待办事项的状态管理
2017/03/15 Javascript
JS中IP地址与整数相互转换的实现代码
2017/04/10 Javascript
使用3D引擎threeJS实现星空粒子移动效果
2020/09/13 Javascript
JavaScript中arguments和this对象用法分析
2018/08/08 Javascript
javascriptvoid(0)含义以及与&quot;#&quot;的区别讲解
2019/01/19 Javascript
javascript获取select值的方法完整实例
2019/06/20 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
vue-admin-template配置快捷导航的代码(标签导航栏)
2020/09/04 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
python实现k均值算法示例(k均值聚类算法)
2014/03/16 Python
Python中使用Tkinter模块创建GUI程序实例
2015/01/14 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
CSS3地图动态实例代码(圆圈向外扩散)
2018/06/15 HTML / CSS
德国珠宝和配件商店:Styleserver
2021/02/23 全球购物
文科教师毕业的自我评价
2014/01/16 职场文书
晚归检讨书
2014/02/19 职场文书
元宵节晚会主持人串词
2014/03/25 职场文书
复兴之路观后感
2015/06/02 职场文书
迎国庆主题班会
2015/08/17 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
导游词之嵊泗列岛
2019/10/30 职场文书
FP-growth算法发现频繁项集——发现频繁项集
2021/06/24 Python
Redis集群的关闭与重启操作
2021/07/07 Redis