JAVA实现生成图片验证码

大家先来看效果:
在这里插入图片描述
具体代码实现如下:

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("输出完成");
	}
}

最后:感谢软帝课堂!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值