图片验证码--Java语言

使用Java语言实现图片验证码的生成,并实现验证码验证操作。


package com.m.test5.user.controller;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;

/**	
 * 生成验证码
 * 小备注:
 *     属性私有化,行为公开化。
 *     ctrl+shift+x: 转大写/小写.
 * **/
public class Code {
	//声明验证码图片的宽度和高度
	private static final int W = 100;
	private static final int H = 40;
	
	//验证码生成库   
	private static final String CODE = "abcdefghijklmABCDEFGHIJKLM0123456789";
	
	//验证码的字符数量
	private static final int CODE_COUNT = 4;
	//干扰线的数量
	private static final int LINE_COUNT = 4;
	
	//创建一个随机数对象
	Random ran = new Random();
	
    //获取验证码的StringBuffer对象,用于最后的验证。
	static StringBuffer str = new StringBuffer("");    
	
	
	//绘制验证码图片的方法
	public void getCode() {
		//生成验证码图片
		BufferedImage img = new BufferedImage(W,H,BufferedImage.TYPE_INT_RGB);
		//获取画笔
		Graphics g = img.getGraphics();
		//设置画笔颜色
		g.setColor(getColor());      //背景色
		//设置 填充可绘制的区域---坐标(0,0)  宽高:W、H
		g.fillRect(0, 0, W, H);
		//创建字体对象
		Font font = new Font("黑体",Font.BOLD,25);
		//设置字体
		g.setFont(font);
		//循环结构
		for(int i = 0;i<CODE_COUNT;i++) {    //写里面的字的颜色
			//再设置画笔颜色
			g.setColor(getColor());
			//从仓库中获取验证码字符
			char c = getChar();
            //得到每一个字符
			str.append(c);
			//绘制到图像中y
			g.drawString(c+"", i*20+10, 25);   //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 {
			ImageIO.write(img, "jpg", new FileOutputStream("code.jpg"));
		} 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,256)
	}
	
	
	public static void main(String[] args) {
		new Code().getCode();
		System.out.println("输出成功");
		System.out.println("生成的验证码是:"+str);  
		if("".equals(str)) {
			System.out.println("验证成功!");
		}else{
            System.out.println("验证失败!");
        }
	}
}

小遗憾:没有在页面上实现。

参考视频(B站):Java周哥  Java实现网站必备验证码图片_哔哩哔哩_bilibili

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值