根据字符串生成图片验证码

在工作中我们可能会遇到这样的需求,根据后台生成的文字验证码生成图片验证码,这里可以利用canvas完成这一需求,代码如下:

创建getcode.js,内容如下:

/**
 * 根据已知的验证码生成图片验证码
 */

var getGVerify = function(id,value){
  function GVerify(options,value) { //创建一个图形验证码对象,接收options对象为参数
    this.options = { //默认options参数值
      id: "", //容器Id
      canvasId: "verifyCanvas", //canvas的ID
       "70", //默认canvas宽度
      height: "36", //默认canvas高度
      type: "blend", //图形验证码默认类型blend:数字字母混合类型、number:纯数字、letter:纯字母
      code: "",
      value: value
    }

    if(Object.prototype.toString.call(options) == "[object Object]"){//判断传入参数类型
      for(var i in options) { //根据传入的参数,修改默认参数值
        this.options[i] = options[i];
      }
    }else{
      this.options.id = options;
    }

    this._init();
    this.refresh(value);
  }

  GVerify.prototype = {
    /**版本号**/
    version: '1.0.0',

    /**初始化方法**/
    _init: function() {
      var con = document.getElementById(this.options.id);
      var canvas = document.createElement("canvas");
      canvas.id = this.options.canvasId;
      canvas.width = this.options.width;
      canvas.height = this.options.height;
      canvas.style.cursor = "pointer";
      canvas.innerHTML = "您的浏览器版本不支持canvas";
      con.appendChild(canvas);
      var parent = this;
    },

    /**生成验证码**/
    refresh: function(value) {
      this.options.code = '';
      var canvas = document.getElementById(this.options.canvasId);
      if(canvas.getContext) {
        var ctx = canvas.getContext('2d');
      }
      ctx.textBaseline = "middle";

      ctx.fillStyle = randomColor(180, 240);
      ctx.fillRect(0, 0, this.options.width, this.options.height);
      
      var txtArr = value.split("");
      for(var i = 1; i <= value.length; i++) {   //value.length可控制验证码位数
        var txt = txtArr[i-1];
        this.options.code += txt;
        ctx.font = '20px SimHei';
        //ctx.font = randomNum(this.options.height/2, this.options.height) + '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 = this.options.width / (value.length+1) * i;
        var y = this.options.height / 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);
      }
      /**绘制干扰线**/
      for(var i = 0; i < 4; i++) {
        ctx.strokeStyle = randomColor(40, 180);
        ctx.beginPath();
        ctx.moveTo(randomNum(0, this.options.width/2), randomNum(0, this.options.height/2));
        ctx.lineTo(randomNum(0, this.options.width/2), randomNum(0, this.options.height));
        ctx.stroke();
      }
      /**绘制干扰点**/
      for(var i = 0; i < this.options.width/4; i++) {
        ctx.fillStyle = randomColor(0, 255);
        ctx.beginPath();
        ctx.arc(randomNum(0, this.options.width), randomNum(0, this.options.height), 1, 0, 2 * Math.PI);
        ctx.fill();
      }
    }
  }
  /**生成一个随机数**/
  function randomNum(min, max) {
    return Math.floor(Math.random() * (max - min) + min);
  }
  /**生成一个随机色**/
  function randomColor(min, max) {
    var r = randomNum(min, max);
    var g = randomNum(min, max);
    var b = randomNum(min, max);
    return "rgb(" + r + "," + g + "," + b + ")";
  }

  return new GVerify(id,value);
}
export default getGVerify;

使用方法:

引入getcode.js,

import getGVerify from 'url/getCode.js' //url为文件地址

在js中调用:

getGVerify(id,code) //id为输出的dom节点的id,code为后台生成的验证码

 参考:http://www.jb51.net/article/117711.htm

我自横刀向天笑,哈哈哈哈哈哈哈!
原文地址:https://www.cnblogs.com/yinian/p/8884810.html