import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;
/**
* @Description: 验证码工具类 ,可以设置背景大体颜色,验证码长度,图像内容,图像大小等等属性,最终的到一个image 对像
* @author: 007
* @CreateDate:
* @version:
*/
public class ImageUtil
{
/**
* 随机类
*/
private Random random = new Random();
/**
* 验证码值
*/
private String sRandom = "";
/**
* 验证码长度
*/
private int imageLength = 4;
/**
* 随机线数量
*/
private int randLineCount = 100;
/**
* 宽度
*/
private int width = 60;
/**
* 长度
*/
private int height = 25;
/**
* 验证码图像
*/
private BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
/**
* 获取图形上下文
*/
private Graphics graphics = image.getGraphics();
/**
* 字体类
*/
private Font font = new Font("Times New Roman", Font.PLAIN, 18);
/**
* 验证码显示字符库
*/
private char[] selectChar = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B',
'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
'Z' };
/**
* 随机线颜色起始值
*/
private int lfCloor = 120;
/**
* 随机线颜色结束值
*/
private int lbCloor = 130;
/**
*
*/
private int fCloor = 195;
/**
*
*/
private int bCloor = 205;
/**
* 获得验证码的值大写值
*
* @return
*/
public String getsRandom()
{
return sRandom.toUpperCase();
}
/**
* 获取验证码图像公开方法
*
* return 图像
*/
public BufferedImage getImage()
{
DrawImage();
return image;
}
/**
* 随机划线
*/
private void drawRandomLine()
{
graphics.setColor(getRandColor(lfCloor, lbCloor));
for (int i = 0; i < randLineCount; i++)
{
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
graphics.drawLine(x, y, x + xl, y + yl);
}
}
/**
* 生成图验证码图像
*
*/
private void DrawImage()
{
// 设定背景色
graphics.setColor(getRandColor(fCloor, bCloor));
//换背景图
graphics.fillRect(0, 0, width, height);
//设定字体
graphics.setFont(font);
//生成随机线
drawRandomLine();
//生成随机字符
for (int i = 0; i < imageLength; i++)
{
int charIndex = random.nextInt(selectChar.length);
String rand = "" + selectChar[charIndex];
sRandom += rand;
//调用函数出来的颜色相同,可能是因为种子太接近,所以只能直接生成
graphics.setColor(new Color(20 + random.nextInt(110), 40 + random.nextInt(110), 60 + random.nextInt(110)));
graphics.drawString(rand, 13 * i - (random.nextInt(5) * 2) + 6, 16);
}
graphics.dispose();
}
/**
* 按给定范围产生随机颜色
*
* @param 开始颜色指数
* @param 结束颜色指数
* @return 颜色对象
*/
private Color getRandColor(int fc, int bc)
{
//给定范围获得随机颜色
Random random = new Random();
if (fc > 255)
{
fc = 255;
}
if (bc > 255)
{
bc = 255;
}
int r = fc + random.nextInt(bc - fc);
int g = fc + random.nextInt(bc - fc);
int b = fc + random.nextInt(bc - fc);
return new Color(r, g, b);
}
public void setSelectChar(final char[] selectChar)
{
this.selectChar = selectChar;
}
public void setImageLength(final int imageLength)
{
this.imageLength = imageLength;
}
public void setRandLineCount(final int randLineCount)
{
this.randLineCount = randLineCount;
}
public void setWidth(final int width)
{
this.width = width;
}
public void setHeight(final int height)
{
this.height = height;
}
public void setFont(final Font font)
{
this.font = font;
}
public void setLfCloor(final int lfCloor)
{
this.lfCloor = lfCloor;
}
public void setLbCloor(final int lbCloor)
{
this.lbCloor = lbCloor;
}
public void setfCloor(final int fCloor)
{
this.fCloor = fCloor;
}
public void setbCloor(final int bCloor)
{
this.bCloor = bCloor;
}
}
验证码工具类

最新推荐文章于 2022-10-17 14:22:10 发布