PHP生成图像验证码的方法小结(2种方法)


Posted in PHP onJuly 18, 2016

本文实例讲述了PHP生成图像验证码的方法。分享给大家供大家参考,具体如下:

1、生成加法运算验证码图片

session_start ();
/*定义头文件为图片*/
header("Content-type: image/png");
/*生成验证码*/
/*创建图片设置字体颜色*/
$im = imagecreate($w, $h);
$red = imagecolorallocate($im, 255, 255, 255);
$white = imagecolorallocate($im, 255, 255, 255);
/*随机生成两个数字*/
$num1 = rand(1, 20);
$num2 = rand(1, 20);
$_SESSION ["administratorConfirmCode"] = $num1+$num2;
/*设置图片背景颜色*/
$gray = imagecolorallocate($im, 118, 151, 199);
$black = imagecolorallocate($im, mt_rand(0, 100), mt_rand(0, 100), mt_rand(0, 100));
/*创建图片背景*/
imagefilledrectangle($im, 0, 0, 100, 24, $black);
/*在画布上随机生成大量点*/
for ($i = 0; $i < 80; $i++) {
  imagesetpixel($im, rand(0, $w), rand(0, $h), $gray);
}
/*将计算验证码写入到图片中*/
imagestring($im, 5, 5, 4, $num1, $red);
imagestring($im, 5, 30, 3, "+", $red);
imagestring($im, 5, 45, 4, $num2, $red);
imagestring($im, 5, 70, 3, "=", $red);
imagestring($im, 5, 80, 2, "?", $white);
/*输出图片*/
imagepng($im);
imagedestroy($im);

2、生成字符验证码图片【值得注意的是在字体哪里,需要引入实际的字体路径,否则,可能出现图像显示不了验证码】

session_start ();
/*设置文件头为图片输出*/
Header("Content-type: image/JPEG");
/*调用生成验证码函数*/
$str="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234565789";
$result="";
for($i=0;$i<$length;$i++){
  $num[$i]=rand(0,61);
  $result.=$str[$num[$i]];
}
$text = $result;
$_SESSION ["administratorConfirmCode"] = $text;
/*设置图片的宽度和高度*/
$im_x = $w;
$im_y = $y;
/*创建图片*/
$im = imagecreatetruecolor($im_x,$im_y);
$text_c = ImageColorAllocate($im, mt_rand(0,100),mt_rand(0,100),mt_rand(0,100));
$tmpC0=mt_rand(100,255);
$tmpC1=mt_rand(100,255);
$tmpC2=mt_rand(100,255);
$buttum_c = ImageColorAllocate($im,$tmpC0,$tmpC1,$tmpC2);
imagefill($im, 16, 13, $buttum_c);
/*字体文件*/
$font = _WEB_DIR_.'/font/comic.ttf';
for ($i=0;$i<strlen($text);$i++){
  $tmp =substr($text,$i,1);
  $array = array(-1,1);
  $p = array_rand($array);
  $an = $array[$p]*mt_rand(1,10);//角度
  $size = 28;
  imagettftext($im, $size, $an, 15+$i*$size, 35, $text_c, $font, $tmp);
}
/*将字符写入文件中*/
$distortion_im = imagecreatetruecolor ($im_x, $im_y);
imagefill($distortion_im, 16, 13, $buttum_c);
for ( $i=0; $i<$im_x; $i++) {
  for ( $j=0; $j<$im_y; $j++) {
    $rgb = imagecolorat($im, $i , $j);
    if( (int)($i+20+sin($j/$im_y*2*M_PI)*10) <= imagesx($distortion_im)&& (int)($i+20+sin($j/$im_y*2*M_PI)*10) >=0 ) {
      imagesetpixel ($distortion_im, (int)($i+10+sin($j/$im_y*2*M_PI-M_PI*0.1)*4) , $j , $rgb);
    }
  }
}
/*干扰元素点的数量*/
$count = 160;
/*创建干扰元素点*/
for($i=0; $i<$count; $i++){
  $randcolor = ImageColorallocate($distortion_im,mt_rand(0,255),mt_rand(0,255),mt_rand(0,255));
  imagesetpixel($distortion_im, mt_rand()%$im_x , mt_rand()%$im_y , $randcolor);
}
/*创建干扰线条*/
$rand = mt_rand(5,30);
$rand1 = mt_rand(15,25);
$rand2 = mt_rand(5,10);
for ($yy=$rand; $yy<=+$rand+2; $yy++){
  for ($px=-80;$px<=80;$px=$px+0.1){
    $x=$px/$rand1;
    if ($x!=0){
      $y=sin($x);
    }
    $py=$y*$rand2;
    imagesetpixel($distortion_im, $px+80, $py+$yy, $text_c);
  }
}
/*以PNG格式将图像输出到浏览器*/
ImagePNG($distortion_im);
/*销毁图像*/
ImageDestroy($distortion_im);
ImageDestroy($im);

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

PHP 相关文章推荐
第十二节 类的自动加载 [12]
Oct 09 PHP
通过ODBC连接的SQL SERVER实例
Oct 09 PHP
非常好的php目录导航文件代码
Oct 09 PHP
php面向对象全攻略 (八)重载新的方法
Sep 30 PHP
解析php中如何调用用户自定义函数
Aug 06 PHP
Codeigniter生成Excel文档的简单方法
Jun 12 PHP
ThinkPHP访问不存在的模块跳转到404页面的方法
Jun 19 PHP
php面象对象数据库操作类实例
Dec 02 PHP
PHP实现操作redis的封装类完整实例
Nov 14 PHP
WordPres对前端页面调试时的两个PHP函数使用小技巧
Dec 22 PHP
深入浅析用PHP实现MVC
Mar 02 PHP
Laravel中错误与异常处理的用法示例
Sep 16 PHP
Yii2中DropDownList简单用法示例
Jul 18 #PHP
Yii2使用dropdownlist实现地区三级联动功能的方法
Jul 18 #PHP
Yii2框架dropDownList下拉菜单用法实例分析
Jul 18 #PHP
用HTML/JS/PHP方式实现页面延时跳转的简单实例
Jul 18 #PHP
浅谈PHP正则中的捕获组与非捕获组
Jul 18 #PHP
Yii2.0表关联查询实例分析
Jul 18 #PHP
php 实现301重定向跳转实例代码
Jul 18 #PHP
You might like
PHP把MSSQL数据导入到MYSQL的方法
2014/12/27 PHP
php显示时间常用方法小结
2015/06/05 PHP
使用php+swoole对client数据实时更新(一)
2016/01/07 PHP
什么是OneThink oneThink后台添加插件步骤
2016/04/13 PHP
使用jQuery实现dropdownlist的联动效果(sharepoint 2007)
2011/03/30 Javascript
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
jQuery中jqGrid分页实现代码
2011/11/04 Javascript
javascript中的事件代理初探
2014/03/08 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
浅谈使用MVC模式进行JavaScript程序开发
2015/11/10 Javascript
Javascript中神奇的this
2016/01/20 Javascript
vue.js利用defineProperty实现数据的双向绑定
2017/04/28 Javascript
微信小程序图片选择区域裁剪实现方法
2017/12/02 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
JavaScript实现获取两个排序数组的中位数算法示例
2019/02/26 Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
2020/03/31 Javascript
浅谈vue-props的default写不写有什么区别
2020/08/09 Javascript
vue实现div可拖动位置也可改变盒子大小的原理
2020/09/16 Javascript
Python脚本实现代码行数统计代码分享
2015/03/10 Python
用python实现将数组元素按从小到大的顺序排列方法
2018/07/02 Python
利用Python如何生成便签图片详解
2018/07/09 Python
Python发送邮件测试报告操作实例详解
2018/12/08 Python
详解Python:面向对象编程
2019/04/10 Python
Python中的单下划线和双下划线使用场景详解
2019/09/09 Python
python 列表、字典和集合的添加和删除操作
2019/12/16 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
2021/03/03 Python
英国最大的手表网站:The Watch Hut
2017/03/31 全球购物
卡骆驰德国官方网站:Crocs德国
2019/03/29 全球购物
英国历史最悠久的DJ设备供应商:DJ Finance、DJ Warehouse、The DJ Shop
2019/09/04 全球购物
C#中有没有运算符重载?能否使用指针?
2014/05/05 面试题
小学生家长评语集锦
2014/01/30 职场文书
自主招生自荐信指南
2014/02/04 职场文书
《千年梦圆在今朝》教学反思
2014/02/24 职场文书
大学生求职信
2014/06/17 职场文书
董事长秘书工作总结
2015/08/14 职场文书