随机数与验证码图片的生成
package com.zg.sxsh.serviceImpl;
import com.zg.sxsh.service.IVerificationCodeImage;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.Random;
public class VerificationCodeImage implements IVerificationCodeImage {
//ASCII 0-9 48-57 A-Z 65-90 a-z 97-122
static int[] asciis=codeASCII();
/**
* 把数字与字母的ASCII码存入int[]中
* @return int[]
*/
static int[] codeASCII(){
int[] asciis=new int[62];
int ascii=48;
for (int i=0;i<10;i++){
asciis[i]=ascii;
ascii++;
}
ascii=65;
for (int i=10;i<36;i++){
asciis[i]=ascii;
ascii++;
}
ascii=97;
for (int i=36;i<62;i++){
asciis[i]=ascii;
ascii++;
}
return asciis;
}
/**
* 生成一串字符串
* @param codeLength 字符串长度
* @param isNum 字符串是否有数字
* @param isABC 字符串是否有字母
* @return
*/
@Override
public String randomVerificationCode(int codeLength, boolean isNum, boolean isABC) {
String verificationCode="";
int index=0;
for(int i=0;i<codeLength;i++){
if (isNum&isABC){
index=randomNum(0,62);
}
else if(isNum){
index=randomNum(0,10);
}
else if (isABC){
index=randomNum(10,62);
}
verificationCode+=String.valueOf((char) asciis[index]);
}
return verificationCode;
}
/**
* 返回一个[minNum,maxNum)的随机数
* @param minNum 最小数
* @param maxNum 最大数
* @return 返回一个字符串
*/
private int randomNum(int minNum,int maxNum){
Random random=new Random();
return random.nextInt(maxNum)+minNum;
}
private static final int IMAGE_WIDTH=100;
private static final int IMAGE_HEIGHT=42;
/**
* 生成验证码图片缓存
* @param verificationCode 验证码字符串
* @return 图像缓存
*/
@Override
public BufferedImage createVerificationCodeImage(String verificationCode){
//定义图像buffer
BufferedImage bufferedImage=new BufferedImage(IMAGE_WIDTH,IMAGE_HEIGHT,BufferedImage.TYPE_INT_RGB);
Graphics graphics=bufferedImage.getGraphics();
Color color=Color.white;
//设置画笔颜色
graphics.setColor(color);
//设置图像形状和大小
graphics.fillRect(0,0,IMAGE_WIDTH,IMAGE_HEIGHT);
//设置字体
Font font =new Font("微软雅黑",Font.BOLD,30);
graphics.setFont(font);
//设置画笔颜色
graphics.setColor(Color.black);
//绘制文字
graphics.drawString(verificationCode,10,31);
//Graphics转换成Graphics2D
Graphics2D graphics2D=(Graphics2D)graphics;
//设置画笔粗细
graphics2D.setStroke(new BasicStroke(2));
//设置八个点
Point[] points=new Point[8];
for (int i=0;i<4;i++){
points[i]=new Point();
points[i].x=1;
points[i].y=randomNum(1,IMAGE_HEIGHT);
}
for (int i=4;i<8;i++){
points[i]=new Point();
points[i].x=IMAGE_WIDTH-1;
points[i].y=randomNum(1,IMAGE_HEIGHT);
}
System.out.println(points);
//根据生成的八个点,画4条干扰线
for (int i=0;i<4;i++){
graphics2D.drawLine(points[i].x,points[i].y,points[i+4].x,points[i+4].y);
}
return bufferedImage;
}
}