绘制字母和数字组合的验证码(原生php)
<?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)的更多相关文章
- 通过JS生成由字母与数字组合的随机字符串
在项目中可能需要随机生成字母数字组成的字符,如生成3-32位长度的字母数字组合的随机字符串(位数不固定)或者生成43位随机字符串(位数固定) 使用Math.random()与toString()方法的 ...
- Java实现随机生成由字母、数字组合的N位随机数
通过Math.random函数生成所需的字符所有序列,通过判断当前字符是否属于大小写.数字,符合者加入数组内,直到数组存储N位为止,最后把当前数组转为字符串返回调用处. /** * 随机生成由数字.字 ...
- 使用php生成数字、字母组合验证码
项目中经常会遇到一些登陆验证,支付验证等等一系列安全验证的策略.实现方法多种多样,下面就来讲解下如何用php生成简单的文字+数字组合的验证码: 所用语言php,gd库 原理解释: a>实质上是在 ...
- 使用php生成数字、字母组合验证码(一)
项目中经常会遇到一些登陆验证,支付验证等等一系列安全验证的策略.实现方法多种多样,下面就来讲解下如何用php生成简单的文字+数字组合的验证码: 所用语言php,gd库 原理解释: a>实质上是在 ...
- JAVAWEB项目实现验证码中文、英文、数字组合
验证码基础 一.什么是验证码及它的作用 :验证码为全自动区分计算机和人类的图灵测试的缩写,是一种区分用户是计算机的公共全自动程序,这个问题可以由计算机生成并评判,但是必须只有人类才能解答.可以防止恶意 ...
- java中获取字母和数字的组合
package com.ccytsoft.wkc.util; import java.util.ArrayList; import java.util.List; import java.util.R ...
- 生成一个字母数字组合的n位随机码、随机数、随机字符串
package com.cms.util; /** * 生成一个字母数字组合的n位随机码 * @author abc * */ public class CodeUtil { // private f ...
- JS生成随机的由字母数字组合的字符串
前言 最近有个需求,是需要生成3-32位长度的字母数字组合的随机字符串,另一个是生成43位随机字符串. 方法一 奇妙的写法 1 Math.random().toString(36).substr( ...
- js随机生成字母数字组合的字符串 随机动画数字
效果描述: 附件中只有一个index.html文件有效 其中包含css以及html两部分内容 纯js生成的几个随机数字 每次都不重复,点击按钮后再次切换 使用方法: 1.将css样式引入到你的网页中 ...
随机推荐
- MEMS 硅麦资料收集
MEMS 硅麦资料收集 PCM 和 I2S 协议的 MEMS Microphone PCM 协议在蓝牙方面比较多,一般都有 PCM 的接口. MEMS Microphone 更加的省电,更方便用于语音 ...
- hdfs 例子
package hadoop; import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; ...
- bzoj 2739 最远点——分治处理决策单调性
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2739 分治处理决策单调性的思想就是先找到一个询问,枚举所有可能的转移找到它的决策点,那么这个 ...
- mysql二进制日志详解
一.什么是二进制日志 二进制日志主要记录mysql数据库的变化,二进制日志包含所有更新了数据或者潜在更新了数据(如没有匹配到任何行的delete语句),语句以时间的形式保存,描述了数据的更改.二进制日 ...
- SourceInsight宏插件1(非常好用,强力推荐)
对于一直使用sourceinsight编辑C/C++代码的工程师们,sourceinsight是一个非常好用的编辑工具可以任意定位,跳转,回退,本人一直使用该工具做C/C++开发,sourceinsi ...
- 企业数据总线(ESB)和注册服务管理(dubbo)的区别
企业数据总线(ESB)和注册服务管理(dubbo)的区别 转载 2015年11月04日 09:05:14 7607 企业数据总线(ESB)和注册服务管理(dubbo)的区别 2015-03-09 0 ...
- elasticsearch 常用命令(一)
索引 搜索 mapping 分词器 1.创建索引 http://192.168.65.131:9200/smartom_index?pretty 2.查看索引: http://192.168.65.1 ...
- ASP防止SQL注入
'防止SQL注入'http://0.0.0.0/bzhs/login.asp?logType=edit';WAITFOR DELAY '0:0:5' --logType = Replace(Repla ...
- oracle常用小知识点
alter table us_studies modify enroldate default to_char(sysdate,'yyyy-mm-dd'); ALTER TABLE QS_QUEUE ...
- T-SQL like charindex patindex 性能比较
事实上在网上可以找到很多这方面的资料,在这边就不多说了~主要观点在性能方面还是比较倾向于charindex,下面就测试下: 测试环境:共50批次,每批次50000数据,测试总共250万数据. 一.li ...