验证码是网站会员系统中不可缺少的,目前验证码有很多种,但用的比较多的还是图片验证码,这里就用面向对象的方式来简单实现图片验证码,

注意!我这里使用的是 PHP 的 gd 库,如果要查看是否启用了 gd 库可以建立一个 phpinfo.php 文件,在文件中加入一句 phpinfo() ,访问 phpinfo.php 就可以查看是否启用了 gd 库,如果 GD Support 为 enabled 就是已启用。

如果要在 Windows 启用 gd 库可以打开 PHP 的安装目录,用文本编辑器打开 php.ini ,去除 xtension=php_gd2.dll 前面的注释即可。

PHP类

PHP代码:<?php

/**

* Created by PhpStorm.

* User: Administrator

* Date: 2017/10/6

* Time: 20:44

*/

class Verification {

protected $fontfile = ''; // 字体文件

protected $width = 120; // 图片宽度 默认120

protected $height = 40; // 图片高度 默认40

protected $size = 20; // 字体大小 默认20

protected $length = 4; // 长度 默认4个字

protected $image = null; // 画布资源

protected $snow = 0; // 雪花干扰 默认没有干扰

protected $pixel = 0; // 像素点干扰 默认没有干扰

protected $line = 0; // 线段干扰 默认没有干扰

// 初始化数据

public function __construct($config = array()) {

if (is_array($config) && count($config) > 0) {

// 检测字体文件是否存在

if (isset($config['fontfile']) && is_file($config['fontfile'])) {

$this->fontfile = $config['fontfile']; // 设置字体文件位置

}else {

return false;

}

// 判断是否传入了宽度和宽度是否大于0

if (isset($config['width']) && $config['width'] > 0) {

// 设置宽度属性为传入的宽度

$this->width = (int)$config['width'];

}

// 判断是否传入高度和高度是否大于0

if (isset($config['height']) && $config['height'] > 0) {

$this->height = (int)$config['height']; // 设置高度属性

}

// 判断是否传入了字体大小和是否大于0

if (isset($config['size']) && $config['size'] > 0) {

$this->size = (int)$config['size']; // 设置字体大小属性

}

// 判断是否传入了验证码长度和长度是否大于0

if (isset($config['length']) && $config['length'] > 0) {

$this->length = (int)$config['length']; // 设置长度

}

// 判断是否设置了雪花干扰以及雪花数量是否大于0

if (isset($config['snow']) && $config['lsnow'] > 0) {

$this->snow = (int)$config['snow']; // 设置雪花干扰

}

// 判断是否设置了像素点干扰和数量是否大于0

if (isset($config['pixel']) && $config['pixel'] > 0) {

$this->pixel = (int)$config['pixel']; // 设置像素点干扰

}

// 判断是否设置了线条干扰和线条数量

if (isset($config['line']) && $config['line'] > 0) {

$this->line = (int)$config['line'];

}

$this->image = imagecreatetruecolor($this->width,$this->height); // 创建画布

return $this->image; // 返回i画布资源

}else {

return false;

}

}

// 生成验证码

public function getCaptcha() {

// 创建白色作为背景

$white = imagecolorallocate($this->image,255, 255, 255);

// 填充背景颜色

imagefilledrectangle($this->image, 0, 0, $this->width, $this->height, $white);

// 调用生成验证码内容的方法

$str = $this->generateStr($this->length);

// 判断生成内容是否成功

if (false === $str) {

return false;

}

$fontfile = $this->fontfile; // 设置字体文件位置

// 使用for循环来生成图片验证码,循环次数是验证码的长度

for ($i = 0;$i < $this->length;$i ++) {

$size = $this->size; // 设置字体大小

$angle = rand(-30, 30); // 设置字体角度

$x = ceil($this->width / $this->length) * $i + rand(5, 10); // 设置X轴位置

$y = ceil($this->height / 1.5); // 设置X轴位置

// 设置字体颜色,调用生成随机颜色的方法

$color = $this->getRandColor();

$text = $str{$i}; // 设置验证码内容

// 把验证码添加到画布上

imagettftext($this->image, $size, $angle, $x, $y, $color, $fontfile, $text);

}

// 是否需要雪花干扰

if ($this->snow > 0) {

$this->getSnow();

}else {

// 只有在没有雪花干扰的情况下才可以使用像素点和线段干扰

if ($this->pixel) {

$this->getPixel();

}

if ($this->line) {

$this->getLine();

}

}

header('content-type:image/png'); // 设置显示方式

imagepng($this->image); // 把生成的验证码图片显示在网页上

imagedestroy($this->image); // 销毁画布 节省资源

return strtolower($str); // 返回生成的验证码内容,用来设置session验证

}

// 生成雪花干扰

protected function getSnow() {

for ($i = 0;$i < $this->snow;$i ++) {

imagestring($this->image, rand(1, 5), rand(0, $this->width), rand(0, $this->height), '*', $this->getRandColor());

}

}

// 生成像素点干扰

protected function getPixel() {

for ($i = 0;$i < $this->pixel;$i ++) {

imagesetpixel($this->image, rand(0, $this->width), rand(0, $this->height), $this->getRandColor());

}

}

// 线段干扰

protected function getLine() {

for ($i = 0;$i < $this->line;$i ++) {

imageline($this->image, rand(0, $this->width), rand(0, $this->height), rand(0, $this->width), rand(0, $this->height), $this->getRandColor());

}

}

// 生成验证码字符

protected function generateStr($length = 4) {

// 判断验证码长度是否小于1或大于30

if ($length < 1 || $length > 30) {

return false;

}else {

// 验证码可能出现的内容

$chars = array(

'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',

'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S','T', 'U', 'V', 'W', 'X', 'Y', 'Z',

'1', '2', '3', '4', '5', '6', '7', '8', '9'

);

}

// 取出指定长度的验证码

$str = join('', array_rand(array_flip($chars), $length));

return $str;

}

// 用来生成随机颜色的

protected function getRandColor() {

return imagecolorallocate($this->image, rand(0, 255), rand(0, 255), rand(0, 255));

}

}

使用方法

对象接收一个数组,除字体文件以外其他参数可以省略,省略的参数会使用默认参数,下面是简单说明:参数类型参数可省略说明fontfilestring否字体文件名称

widthint是图片宽度,默认120px

heightint是图片高度,默认40px

sizeint是字体大小,默认20px

lengthint是验证码长度,默认4个字

snowint是雪花干扰,默认为0,没有干扰

pixelint是像素点干扰,默认为0,没有干扰

lineint是线条干扰,默认为0,没有干扰

代码:<?php

/**

* Created by PhpStorm.

* User: Administrator

* Date: 2017/10/8

* Time: 16:55

*/

require_once 'verification_class.php'; // 引入类文件

$arr = array(

'fontfile'=>'fonts/arial.ttf', // 字体文件位置

'line'=>4, // 设置线条干扰数量为4

'pixel'=>50 // 设置像素点干扰为50

);

$img = new Verification($arr); // 实例化对象并且传入数组

session_start(); // 启用session

$_SESSION['str'] = $img->getCaptcha(); // 把返回的验证码保存到session

完整地传入数组参数可在类属性看到

最终效果如下:

验证码的每一个字都是随机颜色,角度也是随机的,如果要让验证码在 img 标签显示 就把 img 的 src 设置为调用类的 php 文件即可。

验证方法

直接判断表单提交的参数和 session 保存的验证码是否一致即可。

这就是简单实现图片验证码的方法,这个验证码还有很大的优化空间。

代码下载可点击下方的下载代码链接,百度网盘提取码:w39g

php 简单图片验证码,PHP 实现简单图片验证码相关推荐

  1. java创建一个图片_Java 创建一个简单的验证码图片

    代码如下: package lixin.gan.test; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2 ...

  2. [python学习] 简单爬取图片网站图库中图片

    最近老师让学习Python与维基百科相关的知识,无聊之中用Python简单做了个爬取"游讯网图库"中的图片,因为每次点击下一张感觉非常浪费时间又繁琐.主要分享的是如何爬取HTML的 ...

  3. PHP简单方法判断文件是否是图片 PHP best way to check if file is an image

    (PHP 4 >= 4.3.0, PHP 5, PHP 7) exif_imagetype - 判断一个图像的类型 图像类型常量 值 常量 1 IMAGETYPE_GIF 2 IMAGETYPE ...

  4. 图片播放器 简单使用

    (1)前台_客户端:     var focus_width=800;//图片宽     var focus_height=600;//图片高     var text_height=20;//字高 ...

  5. 小程序 背景图 repeat_简单可爱的微信聊天背景图片

    简单可爱的微信聊天背景图片 '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...

  6. python节日贺卡图片大全_简单漂亮三年级新年贺卡图片大全

    春节是中国最隆重的传统节日,它象征着团结.兴旺,是对未来寄托新的希望的佳节.下面小编给大家分享一些简单漂亮三年级新年贺卡图片,大家快来跟小编一起欣赏吧. 简单漂亮三年级新年贺卡图片展示 简单漂亮三年级 ...

  7. cesium加载entity图片缩放_教你使用最简单粗暴的js方法实现图片最小边展示

    实现图片的最小边展示,我们可以直接用background-size:cover;来解决,但是,background是毕竟不是img,如果想宽度固定,高度自适应还是比较难的,而直接用img,那么只能使用 ...

  8. 图片文字转换为文本怎么做?图片转文本的简单方法介绍

    图片文字转换为文本怎么做?我们经常会使用图片记录很多重要的信息,虽然记录的时候很方便,但是在整理的时候却很麻烦,其实我们完全可以借助一些识别软件将其识别出来.下面小编就来教大家来学习简单好用的方法. ...

  9. 图片加水印的简单方法

    图片加水印的简单方法~许多小伙伴都习惯在需要对外发布的图片上添加水印,添加水印后就不必担心图片被盗用或被用于其它不良目的,给我们造成不好的影响.然而,许多用户不知道如何为图片添加水印,也不知道应该选择 ...

最新文章

  1. 在SQL Server中将行有效地转换为列
  2. java内存溢出排查jstack_Java命令行监控工具(jmap,jstack,jstat,jinfo,jps)
  3. android ndk jni so,Android Studio Ndk So 文件
  4. 一起学Python:列表介绍
  5. 海天食品的java开发工作如何_再三个月就秋招了,我想找一份java开发工作,现在应该怎么准备一下?...
  6. 报纸、电商、PC互联网颠覆传统行业,带来新的生态,自媒体也一样
  7. css 属性名 查询表
  8. 国内外云服务器运维面板有哪些?运维面板全面汇总
  9. 基于django的视频点播网站开发-step15-项目部署
  10. 计算机知识二级竞赛流程,计算机知识竞赛比赛规则及流程
  11. 基于SSM框架的毕业设计管理系统 毕业设计-附源码211633
  12. Ubuntu系统清理工具
  13. linux opessl下载_linux安装openssl
  14. 无线降噪耳机品牌推荐,值得入手的四款降噪蓝牙耳机
  15. 200亿元输血求生,中芯国际希望几何?
  16. Charles抓包工具安装教程
  17. 蹉跎二十载,漫漫人生路
  18. Redis实操(20429字总结)
  19. 达州铭仁园2021年高考成绩查询,达州铭仁园私立中学2021年排名
  20. 大屏幕-全屏、退出全屏

热门文章

  1. 揭示十年数据库经验,告诉你如何轻松应对常见问题(SQL 小虚竹)
  2. 【单片机系列】基于51单片机的四路抢答器
  3. 如何恢复损坏的mp4文件:找不到moovatom
  4. Oracle Database 下载地址。无需要注册直接下载
  5. Ospf Sham-link 配置
  6. 阅读React官方文档
  7. 阿里云ddns,动态域名更新Python脚本,基于Python3,适用于linux
  8. 怎么样区分杠杆和融资?
  9. 【步进电机】基于L297A 大功率设计的步进电机驱动器
  10. 电路设计_运算放大器应用