java生成验证码图片的方法

本文实例为大家分享了java生成验证码图片的具体代码,供大家参考,具体内容如下

示例一:

import org.apache.commons.codec.binary.Base64;import org.apache.commons.lang.RandomStringUtils;import org.apache.commons.lang.StringUtils;import javax.imageio.ImageIO;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import java.awt.*;import java.awt.image.BufferedImage;import java.io.ByteArrayOutputStream;import java.util.Random;public class RandomVerifyCode {  private static final String RANDOM_NUM = "23456789";  private static final String RANDOM_LETTER = "ABCDEFGHJKMNPQRSTUVWXYZ";  private static final String RANDOM_LETTER_SMALL = "abcdefghjkmnpqrstuvwxyz";  private static final String RANDOM_STRING = RANDOM_NUM + RANDOM_LETTER + RANDOM_LETTER_SMALL;  private int width = 95;// 图片宽  private int height = 25;// 图片高  private int lineSize = 40;// 干扰线数量  private int stringNum = 4;// 随机产生字符数量  private Random random = new Random();  /**   * 获得字体   */  private Font getFont() {    return new Font("Fixedsys", Font.CENTER_BASELINE, 18);  }  /**   * 获得颜色   */  private Color getRandColor(int fc, int bc) {    if (fc > 255)      fc = 255;    if (bc > 255)      bc = 255;    int r = fc + random.nextInt(bc - fc - 16);    int g = fc + random.nextInt(bc - fc - 14);    int b = fc + random.nextInt(bc - fc - 18);    return new Color(r, g, b);  }  /**   * 生成随机图片(BASE64格式)   */  public String getRandcode(HttpServletRequest request, StringBuffer imgBuffer) {    // BufferedImage类是具有缓冲区的Image类,Image类是用于描述图像信息的类    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);    Graphics g = image.getGraphics();// 产生Image对象的Graphics对象,改对象可以在图像上进行各种绘制操作    g.fillRect(0, 0, width, height);//图片大小    g.setFont(new Font("Times New Roman", Font.ROMAN_BASELINE, 18));//字体大小    g.setColor(getRandColor(110, 133));//字体颜色    // 绘制干扰线    for (int i = 0; i <= lineSize; i++) {      drowLine(g);    }    // 绘制随机字符    String randomString = "";    for (int i = 1; i <= stringNum; i++) {      randomString = drowString(g, randomString, i);    }    g.dispose();    ByteArrayOutputStream out = new ByteArrayOutputStream();    String encode = null;    try {      // 将内存中的图片通过流动形式输出到客户端      ImageIO.write(image, "JPEG", out);      encode = "data:image/jpeg;base64,"+Base64.encodeBase64String(out.toByteArray());      out.close();    } catch (Exception e) {      LogHelper.error("登陆控制","验证码生成","将内存中生成的验证码图片输出为BASE64格式编码失败!");    }    imgBuffer.append(encode);    return randomString;  }  /**   * 绘制字符串   */  private String drowString(Graphics g, String randomString, int i) {    g.setFont(getFont());    g.setColor(new Color(random.nextInt(101), random.nextInt(111), random        .nextInt(121)));    String rand = String.valueOf(getRandomString(random.nextInt(RANDOM_STRING.length())));    randomString += rand;    g.translate(random.nextInt(3), random.nextInt(3));    g.drawString(rand, 13 * i, 16);    return randomString;  }  /**   * 绘制干扰线   */  private void drowLine(Graphics g) {    int x = random.nextInt(width);    int y = random.nextInt(height);    int xl = random.nextInt(13);    int yl = random.nextInt(15);    g.drawLine(x, y, x + xl, y + yl);  }  /**   * 获取随机的字符   */  public String getRandomString(int num) {    return String.valueOf(RANDOM_STRING.charAt(num));  }  public static String randomString(int length){    return RandomStringUtils.random(length, RANDOM_STRING.toCharArray());  }}

示例二:

import javax.imageio.ImageIO;import java.awt.*;import java.awt.image.BufferedImage;import java.awt.image.RenderedImage;import java.io.FileOutputStream;import java.io.OutputStream;import java.util.HashMap;import java.util.Map;import java.util.Random;public class CodeUtil {  private static int width = 90;// 定义图片的width 90  private static int height = 20;// 定义图片的height 20  private static int codeCount = 4;// 定义图片上显示验证码的个数  private static int xx = 15;  private static int fontHeight = 18;  private static int codeY = 16;  private static char[] codeSequence = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'M', 'N', 'P', 'Q', 'R',      'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7', '8', '9'};  public static Map<String,RenderedImage> codePicMap = new HashMap<>();  /**   * 生成一个map集合   * code为生成的验证码   * codePic为生成的验证码BufferedImage对象   *   * @return   */  public static Map<String, Object> generateCodeAndPic() {    // 定义图像buffer    BufferedImage buffImg = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);    // Graphics2D gd = buffImg.createGraphics();    // Graphics2D gd = (Graphics2D) buffImg.getGraphics();    Graphics gd = buffImg.getGraphics();    // 创建一个随机数生成器类    Random random = new Random();    // 将图像填充为蓝色//    gd.setColor(Color.WHITE);    gd.setColor(new Color(232,240,254));    gd.fillRect(0, 0, width, height);    // 创建字体,字体的大小应该根据图片的高度来定。    Font font = new Font("Fixedsys", Font.BOLD, fontHeight);    // 设置字体。    gd.setFont(font);    // 画边框。    gd.setColor(Color.BLACK);    gd.drawRect(0, 0, width - 1, height - 1);    // 随机产生40条干扰线,使图象中的认证码不易被其它程序探测到。    gd.setColor(Color.BLACK);    for (int i = 0; i < 10; i++) {      int x = random.nextInt(width);      int y = random.nextInt(height);      int xl = random.nextInt(12);      int yl = random.nextInt(12);      gd.drawLine(x, y, x + xl, y + yl);    }    // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。    StringBuffer randomCode = new StringBuffer();    int red = 0, green = 0, blue = 0;    // 随机产生codeCount数字的验证码。    for (int i = 0; i < codeCount; i++) {      // 得到随机产生的验证码数字。      String code = String.valueOf(codeSequence[random.nextInt(31)]);      // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。      red = random.nextInt(255);      green = random.nextInt(255);      blue = random.nextInt(255);      // 用随机产生的颜色将验证码绘制到图像中。      gd.setColor(new Color(red, green, blue));      gd.drawString(code, (i + 1) * xx, codeY);      // 将产生的四个随机数组合在一起。      randomCode.append(code);    }    Map<String, Object> map = new HashMap<>();    //存放验证码    map.put("code", randomCode);    //存放生成的验证码BufferedImage对象    map.put("codePic", buffImg);    return map;  }  public static void main(String[] args) throws Exception {    //创建文件输出流对象    OutputStream out = new FileOutputStream("D://img/" + System.currentTimeMillis() + ".jpg");    Map<String, Object> map = CodeUtil.generateCodeAndPic();    ImageIO.write((RenderedImage) map.get("codePic"), "jpeg", out);    System.out.println("验证码的值为:" + map.get("code"));  }}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。

去旅行不在于记忆,而在于当时的那份心情。

java生成验证码图片的方法

相关文章:

你感兴趣的文章:

标签云: