<?php
$font = array('font/FZZQJW.TTF','font/STHUPO.TTF');//字体
$str = '689acdefhjkmnpqrtuvwxyACDEFGHJKMNPQRTUVWXY';//
$size = 20;//验证码字体大小
$number = 4;//验证码字符个数
$width = ($number+1)*$size;//画布宽
$height = $size*2.5;//画布高
$im = imagecreatetruecolor($width,$height);//生成画布,参数(画布宽,画布高)
$randColor = imagecolorallocate($im,rand(0,80),rand(0,80),rand(0,80));//生成画布随机深颜色
imagefilledrectangle($im, 0, 0, $width, $height, $randColor);//给画布添加背景颜色 /*加上干扰点*/
$pn = $size*5;//干扰点个数
for ($i=0; $i < $pn; $i++) { //循环添加像素干扰点
$randColor=imagecolorallocate($im,rand(0,80),rand(0,80),rand(0,80));//生成随机颜色资源
$wx = rand(0,$width);//随机生成干扰点的X轴位置
$hy = rand(0,$height);//随机生成干扰点的Y轴位置
imagesetpixel($im, $wx, $hy, $randColor);//在画布上画一个点,参数(画布资源,位置X,位置Y,颜色资源)
}
/*加上干扰点*/ /*添加随机数字验证码*/
$fontMax = count($font)-1;//获取字体数组最大索引
$vcode = '';//定义一个空字符串
for ($i=0; $i < $number; $i++) {
$x = $size*0.5+$size*$i; ;//设置数字的X轴定位
$y = rand($size*1.5,$size*2);//随机获取数字的Y轴定位
$strMax = strlen($str)-1;//获取验证码源最大索引
$code = $str[rand(0,$strMax)];//获取随机验证码
$vcode .= $code;//拼接验证码
$randColor1=imagecolorallocate($im,rand(0,120),rand(0,120),rand(0,120));//生成随机颜色资源
imagettftext($im, $size , rand(-10,10), $x, $y, $randColor1, $font[rand(0,$fontMax)], $code);//将数字添加进画布,参数(画布资源,文字大小,文字倾斜角度,起点X,起点Y,颜色资源,字体,文字);
}
/*添加随机数字验证码*/ if(!isset($_SESSION)){//通过判断变量$_SESSION是否设置来确认session是否开启
session_start();//开始服务器session功能
}
$_SESSION['vcode']=strtolower($vcode);//将验证码字符串保存到$_SESSION中
ob_clean();//调用函数bo_clean清除之前的输出 header("Content-type: image/png;charset=utf-8");//设置浏览器头信息,内容为png格式的图片
imagepng($im);//输出图片
imagedestroy($im);//销毁图片资源

下面为封装好的

<?php
/**
* [vcode 生成验证码图片]
* @param [自然数] $number [验证码字符个数]
* @param [自然数] $size [验证码字体大小]
* @param [自然数] $width [验证码图片宽度]
* @param [自然数] $height [验证码图片高度]
* @param [字符串] $str [验证码字符串源]
* @param [数组] $font [字体文件路径数组]
*/
function vcode($number=4,$size=20,$width=0,$height=0,$str="347acdefhjkmnpqrtuvwxyACDEFGHJKMNPQRTUVWXY",$font=array('font/FZZQJW.TTF','font/STHUPO.TTF')){
if($width==0) //如果没有传验证码图片宽度参数
{
$width=($number+1)*$size; //自动生成验证码图片的宽度
}
if($height==0) //如果没有传验证码图片高度参数
{
$height=$size*2.5; //自动生成验证码图片的高度
}
$im=imagecreatetruecolor($width,$height);//生成画布,参数(画布宽,画布高)
//$red=imagecolorallocate($im,255,0,0);//生成颜色资源,参数(画布资源,R,G,B)
$randTintColor=imagecolorallocate($im,rand(160,255),rand(160,255),rand(160,255));//生成随机浅颜色资源,参数(画布资源,R,G,B)
$randColor=imagecolorallocate($im,rand(0,80),rand(0,80),rand(0,80));//生成随机深颜色资源,参数(画布资源,R,G,B)
imagefilledrectangle($im, 0, 0, $width, $height, $randTintColor);//给画布添加背景颜色,参数(画布资源,起点X,起点Y,终点X,终点Y,颜色资源)
//imagerectangle($im, 1, 1, 499, 299,$randColor);//画矩形,参数(画布资源,起点X,起点Y,终点X,终点Y,颜色资源)
//$str="0123456789abcdefghijklmnopqrstuvwxyzABCDEFG";//验证码源
//$strC="图片大小超过了浏览器限制";//中文验证码源
//imagestring($im, 5, 20, 20, $str, $randColor);//将字符串添加进画布,参数(画布资源,文字大小[0-5],起点X,起点Y,字符串,颜色资源)
$vcode='';//声明保存验证码字符串的变量
//$font=array('FZZQJW.TTF','STHUPO.TTF');//字体数组
$fontMaxIndex=count($font)-1;//获取字体数组最大索引
for ($i=0; $i <$number ; $i++) { //循环添加文字到画布
$wx=$size*0.5+$size*$i; //设置文字的X轴定位
//$width=50+50*$i*1.2;//设置中文文字的X轴定位
$wy=rand($size*1.5,$size*2); //随机获取文字的Y轴定位
$strMaxIndex=strlen($str)-1;//获取验证码源最大索引
$code=$str[rand(0,$strMaxIndex)];//获取随机验证码
//$rand=rand(0,11);//获取随机数
//$code=mb_substr($strC,$rand,1,'utf-8');//通过截取字符串方式获取验证码
$vcode.=$code;//将验证码拼接到验证码字符串
$randColor1=imagecolorallocate($im,rand(0,120),rand(0,120),rand(0,120));//生成随机颜色资源
imagettftext($im, $size , rand(-10,10), $wx, $wy, $randColor1, $font[rand(0,$fontMaxIndex)], $code);//将文字添加进画布,参数(画布资源,文字大小,文字倾斜角度,起点X,起点Y,颜色资源,字体,文字);
}
$pn=$size*5;
for ($i=0; $i < $pn; $i++) { //循环添加像素干扰点
$randColor=imagecolorallocate($im,rand(0,80),rand(0,80),rand(0,80));//生成随机颜色资源
$wwx= rand(0,$width);//设置干扰像素的X轴定位
$wwy= rand(0,$height);//设置干扰像素的y轴定位
// for ($j=0; $j <5 ; $j++) {
// for ($K=0; $K <5 ; $K++) {
//imagesetpixel($im, $wwx+$j, $wwy+$K, $randColor);
imagesetpixel($im, $wwx, $wwy, $randColor);//在画布上画一个点,参数(画布资源,位置X,位置Y,颜色资源)
// }
// }
}
// for ($i=0; $i < 10; $i++) { //循环添加干扰线段
// $randColor=imagecolorallocate($im,rand(0,80),rand(0,80),rand(0,80));//生成随机颜色资源
// $wwxs= rand(0,250);//设置干扰线段起点的X轴定位
// $wwxe= rand(250,500);//设置干扰线段终点的X轴定位
// $wwys= rand(0,300);//设置干扰线段起点的Y轴定位
// $wwye= rand(0,300);//设置干扰线段终点的Y轴定位
// // for ($j=0; $j <5 ; $j++) {
// // for ($K=0; $K <5 ; $K++) {
// //imageline($im, $wwxs+$j, $wwys+$K, $wwxe+$j, $wwye+$K, $randColor);
// imageline($im, $wwxs, $wwys, $wwxe, $wwye, $randColor);//在画布上画一条线,参数(画布资源,起点X,起点Y,终点X,终点Y,颜色资源)
// // }
// // }
// }
// for ($i=0; $i < 10; $i++) { //循环添加干扰弧线
// $randColor=imagecolorallocate($im,rand(0,80),rand(0,80),rand(0,80));//生成随机颜色资源
// $wwx= rand(0,500);//设置干扰弧线中心点的X轴定位
// $wwy= rand(0,300);//设置干扰弧线中心点的Y轴定位
// $www= rand(0,250);//设置干扰弧线宽度
// $wwh= rand(0,150);//设置干扰弧线高度
// $wws= rand(0,360);//设置干扰弧线起点角度
// $wwe= rand(0,360);//设置干扰弧线终点角度
// // for ($j=0; $j <5 ; $j++) {
// // for ($K=0; $K <5 ; $K++) {
// // imagearc($im, $wwx/4, $wwye/4, $wwxs+$j, $wwys+$K, $wwxe+$j, $wwye+$K, $randColor);
// imagearc($im, $wwx, $wwy, $www, $wwh, $wws, $wwe, $randColor);//在画布上画一条弧线,参数(画布资源,中心点X,中心点Y,宽度,高度,起点角度,终点角度,颜色资源)
// // }
// // }
// }
if(!isset($_SESSION)){//通过判断变量$_SESSION是否设置来确认session是否开启
session_start();//开始服务器session功能
}
$_SESSION['vcode']=strtolower($vcode);//将验证码字符串保存到$_SESSION中
ob_clean();//调用函数bo_clean清除之前的输出
header("Content-type: image/png;charset=utf-8");//设置浏览器头信息,内容为png格式的图片
imagepng($im);//输出图片
imagedestroy($im);//销毁图片资源
} vcode();

注意:FONT字体根据个人需求更换。

//大体步骤:

//1.创建画布
//2.背景颜色随机
//3.添加背景颜色
//4.添加干扰元素(点/弧线。。)
//5.添加随机验证码
//6.设置头部信息
//7.保存到session

绘制字母和数字组合的验证码(原生php)的更多相关文章

  1. 通过JS生成由字母与数字组合的随机字符串

    在项目中可能需要随机生成字母数字组成的字符,如生成3-32位长度的字母数字组合的随机字符串(位数不固定)或者生成43位随机字符串(位数固定) 使用Math.random()与toString()方法的 ...

  2. Java实现随机生成由字母、数字组合的N位随机数

    通过Math.random函数生成所需的字符所有序列,通过判断当前字符是否属于大小写.数字,符合者加入数组内,直到数组存储N位为止,最后把当前数组转为字符串返回调用处. /** * 随机生成由数字.字 ...

  3. 使用php生成数字、字母组合验证码

    项目中经常会遇到一些登陆验证,支付验证等等一系列安全验证的策略.实现方法多种多样,下面就来讲解下如何用php生成简单的文字+数字组合的验证码: 所用语言php,gd库 原理解释: a>实质上是在 ...

  4. 使用php生成数字、字母组合验证码(一)

    项目中经常会遇到一些登陆验证,支付验证等等一系列安全验证的策略.实现方法多种多样,下面就来讲解下如何用php生成简单的文字+数字组合的验证码: 所用语言php,gd库 原理解释: a>实质上是在 ...

  5. JAVAWEB项目实现验证码中文、英文、数字组合

    验证码基础 一.什么是验证码及它的作用 :验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答.可以防止恶意 ...

  6. java中获取字母和数字的组合

    package com.ccytsoft.wkc.util; import java.util.ArrayList; import java.util.List; import java.util.R ...

  7. 生成一个字母数字组合的n位随机码、随机数、随机字符串

    package com.cms.util; /** * 生成一个字母数字组合的n位随机码 * @author abc * */ public class CodeUtil { // private f ...

  8. JS生成随机的由字母数字组合的字符串

    前言 最近有个需求,是需要生成3-32位长度的字母数字组合的随机字符串,另一个是生成43位随机字符串. 方法一 奇妙的写法   1 Math.random().toString(36).substr( ...

  9. js随机生成字母数字组合的字符串 随机动画数字

    效果描述: 附件中只有一个index.html文件有效 其中包含css以及html两部分内容 纯js生成的几个随机数字 每次都不重复,点击按钮后再次切换 使用方法: 1.将css样式引入到你的网页中 ...

随机推荐

  1. centos redis5 安装 和 基本配置

    1 下载 redis wget http://download.redis.io/releases/redis-5.0.0.tar.gz 2 解压 tar xzf redis-5.0.0.tar.gz ...

  2. django 保存中文到mysql 报错django.db.utils.DatabaseError: Incorrect string value: '\xE5\xBE\x88\xE7\x81\xB5

    分析: 1.尝试在Python中对数据转码成utf8,'中文'.encode("utf-8"),还是报错 2.观察堆栈发现应该是操作mysql数据库的时候,将数据插入表里出错 所以 ...

  3. 关于plot画图的原理

    首先是导入的: Import matplotlib.pyplot as plt 这份导入要背住,没事就是需要你进行导入的: 然后就是画图了,下面举一个例子: import numpy as np im ...

  4. 洛谷 2234 [HNOI2002]营业额统计——treap(入门)

    题目:https://www.luogu.org/problemnew/show/P2234 学习了一下 treap 的写法. 学习材料:https://blog.csdn.net/litble/ar ...

  5. .NET设计模式 第二部分 创建型模式(3)—建造者模式(Builder Pattern)

    建造者模式(Builder Pattern) ——.NET设计模式系列之四 Terrylee,2005年12月17日 概述 在软件系统中,有时候面临着“一个复杂对象”的创建工作,其通常由各个部分的子对 ...

  6. Azkaban介绍+安装部署+实战案例

    Azkaban介绍 什么是azkaban?1.工作流的作业调度系统2.通过k.v指令写法描述工作流节点3.可以通过web界面去管理工作流 Azkaban安装部署 2.3.1 准备工作 Azkaban ...

  7. EXCEL 将网络图片地址插入为锁定的图片单元格宏

    Sub InsertPic2(ByVal 图片链接 As String, ByVal 插入图片表名 As String, ByVal 插入图片单元格地址 As String) On Error Res ...

  8. Hyperledger fabric 1.3版本的安装部署(原创多机多Orderer部署

    首先,我们在安装前,要考虑一个问题 Hyperledger Fabric,通过指定的节点进行背书授权,才能完成交易的存储 延伸开来,就是为了实现容错.高并发.易扩展,需要zookeeper来选择排序引 ...

  9. PerformEraseBackground 擦除背景(ThemeServices)

    PerformEraseBackground 擦除背景的简单方法(外带ThemeServices例子) 在查这个函数的时候,顺便看到了有趣的代码. 怎么使用 Themes . unit Unit2; ...

  10. ECR是什么意思

    有效客户反应简称为ECR(efficient consumer response).它是1992年从美国的食品杂货业发展起来的一种供应链管理战略.这是一种分销商与供应商为消除系统中不必要的成本和费用并 ...