大家先来看效果:
具体代码实现如下:
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
/**
* 生成验证码图片
* @author Mr.Zhou
*
*/
public class ImgCode {
//属性私有化 行为公开化
//声明验证码图片的宽度和高度
private static final int W = 100;
private static final int H = 40;
//验证码生成库
//ctrl+shift+x
private static final String CODE = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
//验证码的字符数量
private static final int CODE_COUNT = 4;
//干扰线的数量
private static final int LINE_COUNT = 4;
//创建一个随机数对象
Random ran = new Random();
//绘制验证码图片的方法(五要素)
public void getCode(){
//生成验证码图片
BufferedImage img = new BufferedImage(W, H, BufferedImage.TYPE_INT_RGB);
//获取画笔
Graphics g = img.getGraphics();
//设置画笔颜色
g.setColor(getColor());
//填充可绘制的区域
g.fillRect(0, 0, W, H);
//创建字体对象
Font font = new Font("黑体",Font.BOLD,28);
//设置字体
g.setFont(font);
//循环结构
//绘制验证码
for(int i = 0;i<CODE_COUNT;i++){
//设置画笔颜色
g.setColor(getColor());
//从仓库中获取验证码字符
char c = getChar();
//绘制到图像中
g.drawString(c+"", i*20+10, 25);
}
//绘制干扰线
for(int i=0;i<LINE_COUNT;i++){
//设置画笔颜色
g.setColor(getColor());
//两点确定一条线
int xStart = ran.nextInt(W+1);
int yStart = ran.nextInt(H+1);
int xEnd = ran.nextInt(W+1);
int yEnd = ran.nextInt(H+1);
//绘制线条
g.drawLine(xStart, yStart, xEnd, yEnd);
}
//画噪点
int total = (int)(W*H*0.02);
for(int i=0;i<total;i++){
//设置画笔颜色
g.setColor(getColor());
int x = ran.nextInt(W);
int y = ran.nextInt(H);
//绘制点
img.setRGB(x, y, getColor().getRGB());
}
//通过IO流将图片输出到指定位置
try {
File file = new File("E:\\study\\other\\code.jpg");
if(file.exists()){
file.delete();
}
ImageIO.write(img, "jpg", new FileOutputStream(file));
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//从仓库中获取字符的方法
public char getChar(){
//从仓库中随机取值
return CODE.charAt(ran.nextInt(36));//[0-36)
}
//获取颜色的方法
public Color getColor(){
return new Color(ran.nextInt(256),ran.nextInt(256),ran.nextInt(256));//[0,n-1]
}
//程序的入口
public static void main(String[] args) {
new ImgCode().getCode();
System.out.println("输出完成");
}
}
最后:感谢软帝课堂!