图片验证码

图片验证码

1.验证码工具类

public class Code {

   //随机数数组
   private static final char[] CHARS = {
           '1','2', '3', '4', '5', '6', '7', '8', '9',
           'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm',
           'n', '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', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
  };

   private static Code bmpCode;

   public static Code getInstance() {
       if(bmpCode == null)
           bmpCode = new Code();
       return bmpCode;
  }

   //default settings
   //验证码默认随机数的个数
   private static final int DEFAULT_CODE_LENGTH = 4;
   //默认字体大小
   private static final int DEFAULT_FONT_SIZE = 25;
   //默认线条的条数
   //padding值
   private static final int DEFAULT_LINE_NUMBER = 10;
   private static final int BASE_PADDING_LEFT = 10, RANGE_PADDING_LEFT = 15, BASE_PADDING_TOP = 15, RANGE_PADDING_TOP = 20;
   //验证码的默认宽高
   private static final int DEFAULT_WIDTH = 100, DEFAULT_HEIGHT = 50;


   private int width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT;


   private int base_padding_left = BASE_PADDING_LEFT, range_padding_left = RANGE_PADDING_LEFT,
           base_padding_top = BASE_PADDING_TOP, range_padding_top = RANGE_PADDING_TOP;

   private int codeLength = DEFAULT_CODE_LENGTH, line_number = DEFAULT_LINE_NUMBER, font_size = DEFAULT_FONT_SIZE;


   private String code;
   private int padding_left, padding_top;
   private Random random = new Random();
   //验证码图片
   public Bitmap createBitmap() {
       padding_left = 0;

       Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
       Canvas c = new Canvas(bp);

       code = createCode();

       c.drawColor(Color.WHITE);
       Paint paint = new Paint();
       paint.setAntiAlias(true);//是否抗锯齿
       paint.setTextSize(font_size);
       //画验证码
       for (int i = 0; i < code.length(); i++) {
           randomTextStyle(paint);
           randomPadding();
           c.drawText(code.charAt(i) + "", padding_left, padding_top, paint);
      }
       //画线条
       for (int i = 0; i < line_number; i++) {
           drawLine(c, paint);
      }

       c.save();//保存
       c.restore();
       return bp;
  }

   public String getCode() {
       return code;
  }

   //生成验证码
   private String createCode() {
       StringBuilder buffer = new StringBuilder();
       for (int i = 0; i < codeLength; i++) {
           buffer.append(CHARS[random.nextInt(CHARS.length)]);
      }
       return buffer.toString();
  }
   //画干扰线
   private void drawLine(Canvas canvas, Paint paint) {
       int color = randomColor();
       int startX = random.nextInt(width);
       int startY = random.nextInt(height);
       int stopX = random.nextInt(width);
       int stopY = random.nextInt(height);
       paint.setStrokeWidth(1);
       paint.setColor(color);
       canvas.drawLine(startX, startY, stopX, stopY, paint);
  }
   //生成随机颜色
   private int randomColor() {
       return randomColor(1);
  }

   private int randomColor(int rate) {
       int red = random.nextInt(256) / rate;
       int green = random.nextInt(256) / rate;
       int blue = random.nextInt(256) / rate;
       return Color.rgb(red, green, blue);
  }
   //随机生成文字样式,颜色,粗细,倾斜度
   private void randomTextStyle(Paint paint) {
       int color = randomColor();
       paint.setColor(color);
       paint.setFakeBoldText(random.nextBoolean());  //true为粗体,false为非粗体
       float skewX = random.nextInt(11) / 10;
       skewX = random.nextBoolean() ? skewX : -skewX;  //
       paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜
  }
   //随机生成padding值
   private void randomPadding() {
       padding_left += base_padding_left + random.nextInt(range_padding_left);
       padding_top = base_padding_top + random.nextInt(range_padding_top);
  }
}

2.调用该图片

//将验证码用图片的形式显示出来
iv_showCode.setImageBitmap(Code.getInstance().createBitmap());

3.获取当前图片的验证码

codeChecked = Code.getInstance().getCode().toLowerCase();
posted on 2021-11-29 22:16  jeremie_my00  阅读(143)  评论(0)    收藏  举报