欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

图形验证码

程序员文章站 2022-05-13 09:49:10
...

Html:

<!DOCTYPE html>
<html>
<head>
	<title></title>
	<meta charset="utf-8">
    <meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
	<link rel="stylesheet" type="text/css" href="css/prvnum.css">
</head>
<body>
	<div class="pro_box">
		<input type="text" name="" id="input" class="input" placeholder="请输入验证码">
		<div class="cav" title="点击更换验证码">
			<canvas width="80" height="24" id="myCanvas"></canvas>
		</div>
	</div>
</body>
<script type="text/javascript" src="js/jquery.min.js" ></script>
<script type="text/javascript" src="js/prvnum.js" ></script>
</html>

Css:

*{
	margin: 0;
	padding: 0;
}
.pro_box{
	margin: 20px auto;
	width: 214px;
	height: 24px;
}
.input{
	float: left;
	width: 120px;
	height: 20px;
}
.cav{
	float: left;
	margin-left: 10px;
	width: 80px;
	height: 24px;
}

Js:

var code = "";  //在全局定义验证码 
/**创建验证码**/
buildProve();
$(".cav").click(function(){
	buildProve();
});
/**校验验证码**/
$(document).keydown(function(event){  //按下回车键执行校验
    if(event.keyCode == 13){
        numProve();   //校验验证码  
    }
});
/**绘制验证码**/
function buildProve(){
	code = "";  //清空验证码
	var cav_w = $("#myCanvas").width();  //获取画布宽度
	var cav_h = $("#myCanvas").height();  //获取画布高度
	var canvas = $("#myCanvas")[0];   //获取界面的画布
	var ctx=canvas.getContext("2d");   //获取画布的上下文对象
	/**绘制画布**/
	ctx.textBaseline = "middle";  //绘制文本基准线
	ctx.fillStyle = randomColor(180, 240);   //随机选取颜色作为画布背景
	ctx.fillRect(0,0,cav_w,cav_h);  //绘制“填色”的矩形
	/**绘制验证码文本**/
	var txtArr = new Array(0,1,2,3,4,5,6,7,8,9,'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z');//随机数
	for(var i = 1;i <= 4; i++){
		var index = Math.floor(Math.random()*txtArr.length);  //取得随机数的索引(0~61)
		var txt = txtArr[index];  //获取随机文本
		code += txt;  //存入验证码
		ctx.font = randomNum((cav_h/2),cav_h) + 'px SimHei';  //随机生成字体大小
		ctx.fillStyle = randomColor(50, 160); //随机生成字体颜色
		//为文本设置阴影效果
		ctx.shadowOffsetX = randomNum(-3, 3);
		ctx.shadowOffsetY = randomNum(-3, 3);
		ctx.shadowBlur = randomNum(-3, 3);
		ctx.shadowColor = "rgba(0, 0, 0, 0.3)";	
		//计算文本放置的坐标、旋转角度数据
		var x = cav_w / 5 * i;
		var y = cav_h / 2;
		var deg = randomNum(-30, 30);
		//设置坐标原点与旋转角度
		ctx.translate(x, y);  //设置原点
		ctx.rotate(deg * Math.PI / 180);  //设置旋转角度
		//渲染文本
		ctx.fillText(txt, 0, 0);
		//重置坐标原点与旋转角度
		ctx.rotate(-deg * Math.PI / 180);  //重置原点
		ctx.translate(-x, -y);  //重置旋转角度
	}
	/**绘制干扰线**/
	var disturb_line = 4;  //设置干扰线数量
	for(var i = 0;i < disturb_line;i++){
		ctx.strokeStyle = randomColor(40, 180);  //为干扰线设置颜色
		ctx.beginPath(); //丢弃任何当前定义的路径并且开始一条新的路径
		ctx.moveTo(randomNum(0, cav_w), randomNum(0, cav_h));  //l路径起点
		ctx.lineTo(randomNum(0, cav_w), randomNum(0, cav_h));  //路径转折点或结束点
		ctx.stroke();  //渲染线条(笔触)
	}
	/**绘制干扰点**/
	var disturb_dot = 20;  //设置干扰点数量
	for(var i = 0; i < disturb_dot; i++) {
		ctx.fillStyle = randomColor(0, 255);  //为干扰点设置颜色
		ctx.beginPath();  //丢弃任何当前定义的路径并且开始一条新的路径
		ctx.arc(randomNum(0, cav_w), randomNum(0, cav_h), 1, 0, 2 * Math.PI);  //arc()创建弧/曲线(用于创建圆或部分圆)
		ctx.fill();  //渲染点(填充)
	}
}
/**随机生成一个数值**/
function randomNum(min, max) {
	return Math.floor(Math.random() * (max - min) + min);  //随机选取(min,max)区间的数值
}
/**随机生成一种颜色**/
function randomColor(min, max) {
	var r = randomNum(min, max);
	var g = randomNum(min, max);
	var b = randomNum(min, max);
	return "rgb(" + r + "," + g + "," + b + ")";
}
/**验证验证码**/
function numProve(){
	code = code.toUpperCase();  //将存好的验证码转为大写
	var input = $("#input").val().toUpperCase();  //将输入的验证码转为大写
	if(code == input){
		alert("OK");
	}else{
		alert("Error");
		$("#input").val(""); //清空文本框 
	}
}