登陆界面模块解析——生成图片验证码

文章来自我的博客

正文之前

之前做过一个练手的Web项目登陆界面,其中有一个验证码模块,涉及到JavaIO和Java AWT工具所以打算写一篇介绍,顺便对练手项目的源码做一点小变动

正文

1. 变量

首先先定义几个需要的变量

1
2
3
4
5
复制代码    private int width=50;                               //图片缓冲区的宽
private int height=15; //图片缓冲区的高
private Random random=new Random(); //随机数字
private Color color=new Color(255,255,255); //白色背景
private String text; //图片上的文本
2. 随机字符、颜色

随机字符包括了10位数字和26个字母

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
复制代码    //生成随机字符
private char randomChar()
{
//选取随机数字,生成字符
String numbers = "1234567890qwertyuiopasdfghjklzxcvbnm";
int index=random.nextInt(numbers.length());
//转换为char类型
return numbers.charAt(index);
}

//生成随机颜色
private Color randomColor()
{
//以RGB形式表示颜色
int red=random.nextInt(255);
int green=random.nextInt(255);
int blue=random.nextInt(255);
//返回随机生成的颜色
return new Color(red,green,blue);
}
3. 干扰线
1
2
3
4
5
6
7
8
9
10
复制代码    //画干扰线
private void drawLine(Graphics g){
for (int i = 0; i < 2; i++) {
//设置线的颜色
g.setColor(randomColor());
//线的长度从(x1,y1)到(x2,y2)
g.drawLine(random.nextInt(width), random.nextInt(height),
random.nextInt(width), random.nextInt(height));
}
}
4. 验证码中的文本
1
2
3
4
5
复制代码//返回验证码图片中的文本
public String getText()
{
return text;
}
5. 图片缓冲区
1
2
3
4
5
6
7
8
9
10
11
12
复制代码    //创造图片缓冲区
private BufferedImage createImage()
{
//参数为宽度,高度和图像类型
BufferedImage image=new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
Graphics g=image.getGraphics();
//设置颜色
g.setColor(color);
//填充内容
g.fillRect(0,0,width,height);
return image;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
复制代码    //得到图片缓冲区
public BufferedImage getImage()
{
BufferedImage image = createImage(); //创建缓冲区
Graphics g = image.getGraphics(); //得到绘制环境
StringBuilder stringBuilder = new StringBuilder(); //验证码文本

//验证码长度为4
for (int i=0;i<4;i++)
{
String str = String.valueOf(randomChar()); //产生随机字符,将char类型转为String类型
stringBuilder.append(str); //将生成的随机字符添加至stringBuilder
g.setColor(randomColor()); //产生随机颜色
g.drawString(str, i * width / 4, height); //绘制文本
}
drawLine(g); //添加干扰线
text = stringBuilder.toString(); //把生成字符串赋给文本,以便于验证
return image;
}
6. 输出图片
1
2
3
4
5
复制代码    //使用输出流打印图片
public static void output(BufferedImage image, OutputStream out) throws IOException {
//作为JPEG格式输出图片
ImageIO.write(image,"JPG",out);
}
Demo

直接输出图片到我的桌面

运行之后的结果:

就这样,简单的验证码就做完了

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%