php 简单图片验证码,PHP 实现简单图片验证码

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

注意!我这里使用的是 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

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

最终效果如下:

7a3f7855e75bea0698ec383621c42ce5.png

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

验证方法

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
东南亚位于我国倡导推进的“一带一路”海陆交汇地带,作为当今全球发展最为迅速的地区之一,近年来区域内生产总值实现了显著且稳定的增长。根据东盟主要经济体公布的最新数据,印度尼西亚2023年国内生产总值(GDP)增长5.05%;越南2023年经济增长5.05%;马来西亚2023年经济增速为3.7%;泰国2023年经济增长1.9%;新加坡2023年经济增长1.1%;柬埔寨2023年经济增速预计为5.6%。 东盟国家在“一带一路”沿线国家中的总体GDP经济规模、贸易总额与国外直接投资均为最大,因此有着举足轻重的地位和作用。当前,东盟与中国已互相成为双方最大的交易伙伴。中国-东盟贸易总额已从2013年的443亿元增长至 2023年合计超逾6.4万亿元,占中国外贸总值的15.4%。在过去20余年中,东盟国家不断在全球多变的格局里面临挑战并寻求机遇。2023东盟国家主要经济体受到国内消费、国外投资、货币政策、旅游业复苏、和大宗商品出口价企稳等方面的提振,经济显现出稳步增长态势和强韧性的潜能。 本调研报告旨在深度挖掘东南亚市场的增长潜力与发展机会,分析东南亚市场竞争态势、销售模式、客户偏好、整体市场营商环境,为国内企业出海开展业务提供客观参考意见。 本文核心内容: 市场空间:全球行业市场空间、东南亚市场发展空间。 竞争态势:全球份额,东南亚市场企业份额。 销售模式:东南亚市场销售模式、本地代理商 客户情况:东南亚本地客户及偏好分析 营商环境:东南亚营商环境分析 本文纳入的企业包括国外及印尼本土企业,以及相关上下游企业等,部分名单 QYResearch是全球知名的大型咨询公司,行业涵盖各高科技行业产业链细分市场,横跨如半导体产业链(半导体设备及零部件、半导体材料、集成电路、制造、封测、分立器件、传感器、光电器件)、光伏产业链(设备、硅料/硅片、电池片、组件、辅料支架、逆变器、电站终端)、新能源汽车产业链(动力电池及材料、电驱电控、汽车半导体/电子、整车、充电桩)、通信产业链(通信系统设备、终端设备、电子元器件、射频前端、光模块、4G/5G/6G、宽带、IoT、数字经济、AI)、先进材料产业链(金属材料、高分子材料、陶瓷材料、纳米材料等)、机械制造产业链(数控机床、工程机械、电气机械、3C自动化、工业机器人、激光、工控、无人机)、食品药品、医疗器械、农业等。邮箱:market@qyresearch.com
PHP图片验证码的实现方式如下: 1. 首先,生成随机字符串或数字,作为验证码的文本信息。 2. 创建一个空白的图片,设置图片的宽度和高度,同时设置背景颜色和字体颜色。 3. 将随机字符串或数字绘制到图片上,可以使用 imagettftext() 函数实现文字的绘制。 4. 对图片进行干扰处理,可以添加干扰线、噪点、随机颜色等。 5. 输出图片并销毁图片资源,同时将验证码文本信息保存到 session 中,方便后续验证。 下面是一个简单PHP 图片验证实现示例: ```php <?php session_start(); // 生成随机字符串 $code = rand(1000, 9999); // 保存验证码到 session $_SESSION['code'] = $code; // 创建空白图片 $image = imagecreate(100, 30); // 设置背景颜色和字体颜色 $bg_color = imagecolorallocate($image, 255, 255, 255); $font_color = imagecolorallocate($image, 0, 0, 0); // 将验证码绘制到图片上 imagettftext($image, 20, 0, 10, 20, $font_color, 'arial.ttf', $code); // 添加干扰线和随机颜色 for ($i = 0; $i < 5; $i++) { $line_color = imagecolorallocate($image, rand(0, 255), rand(0, 255), rand(0, 255)); imageline($image, rand(0, 100), rand(0, 30), rand(0, 100), rand(0, 30), $line_color); } // 输出图片 header('Content-Type: image/png'); imagepng($image); // 销毁图片资源 imagedestroy($image); ?> ``` 在 HTML 表单中使用该验证码: ```html <form action="submit.php" method="post"> <label for="code">验证码:</label> <input type="text" id="code" name="code"> <img src="captcha.php" alt="验证码"> <input type="submit" value="提交"> </form> ``` 在后台 PHP 脚本中验证验证码: ```php <?php session_start(); if ($_POST['code'] == $_SESSION['code']) { // 验证码正确 } else { // 验证码错误 } ?> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值