PHP 验证码:扭曲+粘连+变形
一,绪论
由于项目需要,需要加强目前的验证码,我们参照的对象是支付宝。
基于PHP CodeIgniter 框架,代码放置在下面的路径下。
/application/libraries
二,主要代码
class VerifyCode
{ //声明图像大小
private $width = 78;
private $height = 46; //验证码字符有限集
private $v_char = '1234567890';
private $v_code_str = ''; //验证码数量
private $v_num = 4; // 第i个文字x轴起始位置计算公式: x轴起始坐标 = margin + padding * i
//文字内外边距
private $padding = 15;
private $margin = 3; //字体大小
private $font_size = 30; //字体逆时针旋转的角度
private $font_angles = array(-5, 5); //字体名称
//private $font = 'Wattauchimma.ttf';
private $font = 'msyh.ttf'; //加上路径非常重要 //图像容器
private $img; //颜色容器
private $colors = array(); /**
* 生成图片验证码主逻辑
* @author 冯煜博
*/
public function __construct()
{
//生成一幅图像
$this->img = imagecreate($this->width, $this->height); //生成颜色
$this->colors['white'] = imagecolorallocate($this->img, 255,255,255);
$this->colors['blue'] = imagecolorallocate($this->img, 0, 47, 167); // 生成纯白色背景
imagecolorallocate($this->img, 255,255,255); // 设置GD库环境变量
putenv('GDFONTPATH=' . realpath('.')); //生成验证码字符
$this->randomContent();
} /**
* 输出验证码,返回值是验证码的字符串表示
* @author 冯煜博
* @return string
*/
public function show()
{
$this->generate(); header('Cache-Control: private, max-age=0, no-store, no-cache, must-revalidate');
header('Cache-Control: post-check=0, pre-check=0', false);
header('Pragma: no-cache');
header("content-type: image/png"); ImagePNG($this->img);
ImageDestroy($this->img); return $this->v_code_str;
} /**
* 生成随机的验证码的内容
* @author 冯煜博
* @return string
*/
private function randomContent()
{
for($i = 0; $i < $this->v_num; $i++)
{
$this->v_code_str .= $this->v_char[ rand(0, strlen($this->v_char) - 1)];
}
} /**
* 生成验证码的图像
* @author 冯煜博
*/
private function generate()
{
//生成验证码的算法
for($i = 0; $i < $this->v_num; $i++)
{
// 下一个字符的起始x轴坐标
$x = $this->margin + $this->padding * $i;
// 下一个字符的起始y轴坐标
$y = 38; imagettftext(
$this->img,
$this->font_size,
$this->font_angles[ rand(0, count($this->font_angles) - 1) ],
$x, $y,
$this->colors['blue'],
APPPATH.'libraries/'.$this->font, //加上了字体的相对路径
$this->v_code_str[ $i ]
);
} $dst = imagecreatetruecolor($this->width, $this->height);
$dWhite = imagecolorallocate($dst, 255, 255, 255);
imagefill($dst,0,0,$dWhite); //扭曲,变形
for($i = 0; $i < $this->width; $i++)
{
// 根据正弦曲线计算上下波动的posY $offset = 4; // 最大波动几个像素
$round = 2; // 扭2个周期,即4PI
$posY = round(sin($i * $round * 2 * M_PI / $this->width ) * $offset); // 根据正弦曲线,计算偏移量 imagecopy($dst, $this->img, $i, $posY, $i, 0, 1, $this->height);
} $this->img = $dst;
} public function __destruct()
{
unset($this->colors);
}
}
三,CI 框架内的写法
比如在 VCode 控制器内的 show 方法中,调用:
class VCode extends CI_Controller
{
/*
* 显示验证码的网页实际上是异步进行加载的,也就是先后发起两次请求。
* 第一次加载HTML页面;
* 第二次加载图片
*/
public function show()
{ $this->load->library('VerifyCode'); $this->load->library('session');
$this->session->set_flashdata('vcode', $this->verifycode->show()); //session_start();
//$_SESSION['vcode'] = $this->verifycode->show();
} }
四,THML调用代码
我们知道,只要访问 {$domain}index.php/vcode/show 就可以看到一张验证码图片。
所以在HTML的 img src属性中填写上面的URL就可以。
<html>
<body> <img src="index.php/vcode/show" /> <br/> <?php echo form_open('vcode/verify') ?>
<input name="codeStr" />
<input type="submit" name="submit" value="verify" />
</form> </body>
</html>
五,生成的验证码效果图
PHP 验证码:扭曲+粘连+变形的更多相关文章
- java web 验证码-数字不变形
controller代码: import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.a ...
- Pyhthon爬虫其之验证码识别
背景 现在的登录系统几乎都是带验证手段的,至于验证的手段也是五花八门,当然用的最多的还是验证码.不过纯粹验证码识已经是很落后的东西了,现在比较多见的是滑动验证,滑动拼图验证(这个还能往里面加广告).点 ...
- 字符型图片验证码识别完整过程及Python实现
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- Atitit 图片 验证码生成attilax总结
Atitit 图片 验证码生成attilax总结 1.1. 图片验证码总结1 1.2. 镂空文字 打散 干扰线 文字扭曲 粘连2 1.1. 图片验证码总结 因此,CAPTCHA在图片验证码这一应用点 ...
- Python识别字符型图片验证码
前言 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越来越严峻.本文介绍了一套字符验证码识别的完整流程,对于验 ...
- 完整的验证码识别流程基于svm(若是想提升,可优化)
字符型图片验证码识别完整过程及Python实现 首先很感觉这篇文章的作者,将这篇文章写的这么好.我呢,也是拿来学习,觉得太好,所以忍不住就进行了转载. 因为我个人现在手上也有个验证码识别的项目,只是难 ...
- python 验证码 高阶验证
python 验证码 高阶验证 标签: 验证码python 2016-08-19 15:07 1267人阅读 评论(1) 收藏 举报 分类: 其他(33) 目录(?)[+] 字符型图片验证 ...
- 字符识别Python实现 图片验证码识别
字符型图片验证码识别完整过程及Python实现 1 摘要 验证码是目前互联网上非常常见也是非常重要的一个事物,充当着很多系统的 防火墙 功能,但是随时OCR技术的发展,验证码暴露出来的安全问题也越 ...
- ArcGIS之Cartogram地图变形记
一.地图会说谎 地图作为真实世界的抽象,是“用图说话”最可靠的工具,但是有的时候地图也会撒一些小小的谎言,其中最著名的例子当属美国总统大选.如图1是2012年美国总统大选后网上给出的一个结果图,红色代 ...
随机推荐
- SQL Fundamentals: 分组统计查询(FROM-WHERE-GROUPBY-HAVING-SELECT-ORDER BY)
SQL Fundamentals || Oracle SQL语言 统计函数 单字段分组统计(GROUP BY) 多字段分组统计 HAVING子句 控制操作的显示列:基本的SELECT语句 控制行:限定 ...
- CSS垂直导航栏
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- FW 构建OpenStack的高可用性(HA,High Availability)
原文地址:http://blog.csdn.net/hilyoo/article/details/7704280 1.CAP理论 1) CAP 理论给出了3个基本要素: 一致性 ( Consisten ...
- 设置tabBar中间的按钮比较大的发布
MainTabBarController.h UITabBarItem *item = [self.tabBar.items objectAtIndex:index]; [item setTitle: ...
- 使用GIT SUBTREE集成项目到子目录(转)
原文:http://aoxuis.me/post/2013-08-06-git-subtree 使用场景 例如,在项目Game中有一个子目录AI.Game和AI分别是一个独立的git项目,可以分开维护 ...
- Eclipse+Pydev 搭建开发环境(转)
add by zhj: 对原文略有修改 原文:http://www.cnblogs.com/TankXiao/archive/2013/05/29/3033640.html C#之所以容易让人感兴趣, ...
- 前端(以Vue为例)webpack打包后dist文件包如何部署到django后台中
由于现在前端使用的三大框架配合webpack可以实现快速打包,为部署到服务端提供了非常大的便利,那么在前端打包后,应该做些什么可以部署到django的后台中呢? 1.打包后文件包dist 进入到 di ...
- 【HTML5】HTML5的自学路线
HTML5的开发市场已越来越火爆,他已经与我们的生活息息相关,它也成为了我们生活中的一部分,比如我们在网上购物,玩手游等等,都存在html5的影子,也正是因为html5的高度影响力,吸引了许多人开始关 ...
- 【Python】xpath中为什么粘贴进去代码后老报错?如何在定位元素的时候准确找到定位切入点?
1. xpath后()中双引号("")里面不能套用双引号(""),把里面的双引号改成单引号('')报错就没有了. 2.如何在定位元素的时候准确找到定位切入点? ...
- 四、Mosquitto 高级应用之用户配置
本文将讲解 Mosquitto 用户机制.如果还没有搭建 Mosquitto 服务的可以参考我的另外两篇文章<< 一.Mosquitto 介绍&安装>> << ...