图片验证码工具类
import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.util.Random; import javax.imageio.ImageIO; import javax.imageio.stream.ImageOutputStream; import com.bailian.exception.CommonException; public class VerifyCodeHelper { private static final VerifyCodeHelper verifyCodeHelper = new VerifyCodeHelper(); private final int WIDTH = 15;// 图片的宽度 private final int HEIGHT = 22;// 图片的高度 private final int CODE_LENGTH = 4;// 字符串长度 private final String RAND_RANGE = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";// 随机字符串范围 private final char[] CHARS = RAND_RANGE.toCharArray();//随机字符串范围 private Random random = new Random(); private VerifyCodeHelper() { // } public static VerifyCodeHelper getInstance() { return verifyCodeHelper; } /** * 生成指定字符串的图像数据 * * @param verifyCode 即将被打印的随机字符串 * @return 生成的图像数据 */ public BufferedImage getImage(String verifyCode) { BufferedImage image = new BufferedImage(WIDTH * CODE_LENGTH, HEIGHT, BufferedImage.TYPE_INT_RGB); // 获取图形上下文 Graphics graphics = image.getGraphics(); // 设置背景色 graphics.setColor(getRandColor(1, 30)); // 填充背景色 graphics.fillRect(0, 0, WIDTH * 4, HEIGHT); // 设置边框颜色 graphics.setColor(new Color(0, 255, 0)); // 画边框 for (int i = 0; i < 2; i++) graphics.drawRect(i, i, WIDTH * CODE_LENGTH - i * 2 - 1, HEIGHT - i * 2 - 1); // 设置随机干扰线条颜色 graphics.setColor(getRandColor(50, 100)); // 产生50条干扰线条 for (int i = 0; i < 255; i++) { int x1 = random.nextInt(WIDTH * CODE_LENGTH - 4) + 2; int y1 = random.nextInt(HEIGHT - 4) + 2; int x2 = random.nextInt(WIDTH * CODE_LENGTH - 2 - x1) + x1; int y2 = y1; graphics.drawLine(x1, y1, x2, y2); } // 设置字体 graphics.setFont(new Font("Times New Roman", Font.PLAIN, 18)); // 画字符串 for (int i = 0; i < this.CODE_LENGTH; i++) { String temp = verifyCode.substring(i, i + 1); graphics.setColor(getRandColor(100, 255)); graphics.drawString(temp, 13 * i + 6, 16); } // 图像生效 graphics.dispose(); return image; } public ByteArrayInputStream getVerfyImage(String verifyCode) { ByteArrayInputStream input = null; ByteArrayOutputStream output = new ByteArrayOutputStream(); try { ImageOutputStream imageOut = ImageIO.createImageOutputStream(output); ImageIO.write(getImage(verifyCode), "JPEG", imageOut); imageOut.close(); input = new ByteArrayInputStream(output.toByteArray()); } catch (Exception e) { throw new CommonException("创建验证码图片出现错误", e); } return input; } public ByteArrayInputStream getDefualtVerfyImage(String imagePath) throws Exception { ByteArrayInputStream input = null; BufferedImage bu = ImageIO.read(new File(imagePath)); ByteArrayOutputStream output = new ByteArrayOutputStream(); try { ImageIO.write(bu, "JPEG", output); input = new ByteArrayInputStream(output.toByteArray()); output.close(); } catch (Exception e) { throw new CommonException("获取验证码图片出现错误", e); } return input; } /** * 生成随机字符串 * * @return 随机字符串 */ public String getVerifyCode() { StringBuilder sb = new StringBuilder(); for (int i = 0; i < CODE_LENGTH; i++) sb.append(CHARS[random.nextInt(CHARS.length)]); return sb.toString(); } /* * 给定范围获得随机颜色 */ 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); } }