今天看了一个生成随机图片的代码,不是很懂,但也想记录下,就直接搬下来了,以后希望能用到:
直接复制黏贴就能用
public class RandomValidateCodeUtil { public static final String RANDOMCODEKEY = "MXKTECHRANDOMVALIDATECODEKEY"; //放到Session中的key private String randString = "0123456789"; //随机产生只有数字的字符串 //private String randString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生只有字母的字符串 //private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; //随机产生数字与字母组合的字符串 private int width = 75; //图片宽度 private int height= 25; //图片高度 private int lineSize = 40; //干扰线数量 private int stringNum = 4; //随机产生字符数量 private static final Logger logger = LoggerFactory.getLogger(RandomValidateCodeUtil.class); 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); } //绘制干扰线 private void drawLine(Graphics g){ int x = random.nextInt(width); int y = random.nextInt(height); int x1 = random.nextInt(13); int y1 = random.nextInt(15); g.drawLine(x, y, x + x1, y + y1); } //获取随机的字符 public String getRandomString(int num){ return String.valueOf(randString.charAt(num)); } //绘制字符串 private String drawString(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(randString.length()))); randomString += rand; g.translate(random.nextInt(3), random.nextInt(3)); g.drawString(rand, 13 * i, 16); return randomString; } //生成随机图片 public void getRandCode(HttpServletRequest request, HttpServletResponse response){ HttpSession session = request.getSession(); //BufferedImage类是具有缓冲区的Image类, Image类是用于描述图像信息的类 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR); Graphics g = image.getGraphics(); 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 ++){ drawLine(g); } //绘制随机字符 String randomString = ""; for(int i = 1; i <= stringNum; i ++){ randomString = drawString(g, randomString, i); } logger.info(randomString); //将生成的随机字符串保存到Session中 session.removeAttribute(RANDOMCODEKEY); session.setAttribute(RANDOMCODEKEY, randomString); g.dispose(); try{ //将内存中的图片通过流形式输出到客户端 ImageIO.write(image, "JPEG", response.getOutputStream()); }catch (Exception e){ logger.error("将内存中的图片通过流输出到客户端失败>>>> ", e); } } }