
<canvas id="canvasCode" data-value="code" width="220" height="36"></canvas>
// 提供一个 canvas 入口。内部设置都单独提出来
var canvasWrap = document.getElementById("canvasCode");
rmdCode(canvasWrap);
// canvas 作为画布,可以实现很多特殊图形的设定
// 随机字符;随机线条;随机点;
function rmdCode(canvas){
var ctwidth = canvas.width;
var ctheight = canvas.height;
var ctx = canvas.getContext("2d");
ctx.clearRect(0,0,ctwidth,ctheight); // 清空画布。每次刷新,都能是不同的随机验证码
// 源数据;去除不容易识别的 0,o,I,l,u,U
var characters="abcdefghjkmnpqrstvwxyzABCDEFGHJKMNPQRSTVWXYZ123456789";
// split("")转化成字符串数组
characters = characters.split("");
// 随机产生数字,线条,点点
canvasFont(ctx,characters,5,ctwidth,ctheight);
canvasLine(ctx,6,ctwidth,ctheight);
canvasPoint(ctx,20,ctwidth,ctheight);
}
// 循环fontLen 随机字符;给 #canvasCode 赋值
function canvasFont(canvasName,arr, fontLen,ctwidth,ctheight){
var rdmCode = "";
for( var i=0; i< fontLen; i++ ){
var fontSize = ctheight *3 /4;
canvasName.font = "bold " + fontSize + "px sans-serif";
canvasName.fillStyle = rdmColor();
var fontVal = rdmFont(arr);
// 字符定位;fontX 一定要依次增加
var fontX = (ctwidth/(fontLen +1)) *(i+0.5);
var fontY = Math.random()*(ctheight*1/5)+(ctheight*7/10);
canvasName.fillText(fontVal, fontX ,fontY );
// 旋转 -10~10度。但是旋转会超出范围,故隐藏
// var deg = (Math.random()*20 -10) *Math.PI / 180;
// canvasName.rotate(-deg);
rdmCode = rdmCode.concat(fontVal);
}
$("#canvasCode").val(rdmCode); // 画布canvas 虽然画出来了字符,但是其 val() 依然为空,所以需要赋值!用来表单验证
}
function canvasLine( canvasName,lineLen,ctwidth,ctheight ){
// 随机生成 lineLen 条数的干扰线
for(var i =0; i< lineLen; i++){
linePath(canvasName,ctwidth,ctheight);
}
}
function canvasPoint( canvasName, pointLen,ctwidth,ctheight ){
for(var i=0; i<pointLen; i++){
pointPath(canvasName,ctwidth,ctheight);
}
}
function linePath(canvasName,ctwidth,ctheight){
// 新建一条 path
canvasName.beginPath();
canvasName.lineWidth = 1;
canvasName.globalAlpha = 0.4; // 增加透明度,减轻对文字的干扰
canvasName.strokeStyle = rdmColor();
canvasName.moveTo((Math.floor(Math.random()*100) / 100)*ctwidth,(Math.floor(Math.random()*100) / 100)*ctheight);
canvasName.lineTo((Math.floor(Math.random()*100) / 100)*ctwidth,(Math.floor(Math.random()*100) / 100)*ctheight);
canvasName.stroke();
}
function pointPath(canvasName,ctwidth,ctheight){
canvasName.strokeStyle = rdmColor();
canvasName.lineWidth = 1;
canvasName.globalAlpha = 0.9; // 增加透明度,减轻对文字的干扰
canvasName.beginPath();
var x = Math.random() * ctwidth;
var y = Math.random() * ctheight;
canvasName.moveTo(x,y);
canvasName.lineTo(x+1,y+1);
canvasName.stroke();
}
// 随机出单个 font
function rdmFont(arr){
if(arr[getRndInteger(1,arr.length)] == "undefined"){
return "1";
} else {
return arr[getRndInteger(1,arr.length)];
}
}
// 随机 rgb 颜色
function rdmColor(){
return "rgb("+getRndInteger(1,200)+","+getRndInteger(1,200)+","+getRndInteger(1,200)+")";
}
// 随机循环0-90 度角度
function rdmAngle(){
return (getRndInteger(1,90))*(Math.PI/180);
}
// 产生随机 min - max 之间的随机数
function getRndInteger( min, max ){
return Math.floor(Math.random()*( max- min )) + min;
}
原文:https://www.cnblogs.com/fchx91/p/11023871.html