package org.masque.qq.demo.util; import java.awt.Color; import java.awt.Font; import java.awt.FontFormatException; import java.awt.Graphics2D; import java.awt.geom.AffineTransform; import java.awt.image.BufferedImage; import java.io.FileNotFoundException; import java.io.IOException; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Random; import java.util.Set; import javax.imageio.ImageIO; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; /** * 验证码的生成 * @author * */ @Service("validateUtil") public class ValidateUtil { //正确的验证码 private String trueValidate; private List<String> allValidate; private String trueIndex=""; //验证码的长度 private int validateLimit=4; //可供选择的验证码个数 private int chooseNum=9; private static Random random=new Random(); private static Font customFont = null; public ValidateUtil() { List<String> all = createFontsBylength(chooseNum); //创建9个字 Set<Integer> set=getRandomIndex(chooseNum); //四个随机数 String indexString=""; String rightString =""; for(Integer it:set){ indexString +=it; rightString +=all.get(it); } allValidate = new ArrayList<String>(); allValidate.add(rightString); allValidate.addAll(all); trueValidate = rightString; trueIndex=indexString; } public void initValidate(){ trueValidate=createFont(4); allValidate=getAllFont(trueValidate); } /** * 生成一个汉字 * @return */ private String createFont() { String str = ""; int hightPos, lowPos; // 定义高低位 hightPos = (176 + Math.abs(random.nextInt(39)));//获取高位值 lowPos = (161 + Math.abs(random.nextInt(93)));//获取低位值 byte[] b = new byte[2]; b[0] = (new Integer(hightPos).byteValue()); b[1] = (new Integer(lowPos).byteValue()); try { str = new String(b, "GBk");//转成中文 } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return str; } /** * 生成指定长度的汉字 * @param length * @return */ private String createFont(int length){ String all=""; Set<String> set=new HashSet<String>(); while(set.size()<length){ set.add(createFont()); } for(String str:set){ all+=str; } return all; } /** * 随机生成在可供选择验证码个数内的不重复索引 * @return */ private Set<Integer> getRandomIndex(){ Set<Integer> set=new HashSet<Integer>(); Random r=new Random(); while(set.size()<validateLimit){ int temp=r.nextInt(chooseNum+1); if(temp!=0){ set.add(temp); } } return set; } private Set<Integer> getRandomIndex(int number){ Set<Integer> set=new HashSet<Integer>(); Random r=new Random(); while(set.size()<validateLimit){ int temp=r.nextInt(number); if(temp!=0){ set.add(temp); } } return set; } /** * 生成包括正确验证码在内的随机汉字 * @param str * @return */ private List<String> getAllFont(String str){ List<String> list=new ArrayList<String>(); list.add(str); String all=createFont(chooseNum); for(int i=0;i<chooseNum;i++){ list.add(all.charAt(i)+""); } Set<Integer> set=getRandomIndex(); int index=0; for(Integer it:set){ list.set(it, str.charAt(index++)+""); trueIndex+=(it-1); } // System.out.println(trueIndex); return list; } /** * 返回正确的验证码索引 * @return */ public String getTrueIndex(){ return trueIndex; } /** * 返回正确的验证码 * @return */ public String getTrueValidate(){ return trueValidate; } public void setTrueValidate(String trueValidate){ this.trueValidate = trueValidate; } /** * 返回包含正确验证码的所有可选汉字 * @return */ public List<String> getValidateList(){ return allValidate; } /** * 生成随机颜色 * @param fc 前景色 * @param bc 背景色 * @return Color对象,此Color对象是RGB形式的。 */ private static Color getRandomColor(int fc, int bc) { if (fc > 255) fc = 200; 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); } /** * 绘制干扰线 * @param g Graphics2D对象,用来绘制图像 * @param nums 干扰线的条数 */ private static void drawRandomLines(Graphics2D g ,int nums,int width,int height ){ g.setColor(getRandomColor(160, 200)) ; for(int i=0 ; i<nums ; i++){ int x1 = random.nextInt(width) ; int y1 = random.nextInt(height); int x2 = random.nextInt(12) ; int y2 = random.nextInt(12) ; g.drawLine(x1, y1, x1+x2, y1+y2) ; } } /** * 获取随机字符串, * 此函数可以产生由大小写字母,汉字,数字组成的字符串 * @param length 随机字符串的长度 * @return 随机字符串 */ @SuppressWarnings("unused") private static void drawRandomString(String all, Graphics2D g){ int length=all.length(); for(int i=0 ; i<length ; i++){ Color color = new Color(20+random.nextInt(20) , 20+random.nextInt(20) ,20+random.nextInt(20) ); g.setColor(color) ; //想文字旋转一定的角度 AffineTransform trans = new AffineTransform(); trans.rotate(random.nextInt(45)*3.14/180, 15*i+8, 7) ; g.drawString(all.charAt(i)+"", 18*i+5, 30) ; } g.dispose() ; } /** * 传人文字数组生成图片 * @param all * @param g */ private static void drawRandomString1(List<String> all, Graphics2D g){ int length=all.size(); for(int i=0 ; i<length ; i++){ Color color = new Color(20+random.nextInt(20) , 20+random.nextInt(20) ,20+random.nextInt(20) ); g.setColor(color) ; //想文字旋转一定的角度 AffineTransform trans = new AffineTransform(); trans.rotate(random.nextInt(45)*3.14/180, 15*i+8, 7) ; if(i==0){ g.drawString(all.get(i), 15, 20) ; } if(i==1){ g.drawString(all.get(i), 18, 65) ; } if(i==2){ g.drawString(all.get(i), 70, 65) ; } if(i==3){ g.drawString(all.get(i), 115, 65) ; } if(i==4){ g.drawString(all.get(i), 18, 115) ; } if(i==5){ g.drawString(all.get(i), 70, 115) ; } if(i==6){ g.drawString(all.get(i), 115, 115) ; } if(i==7){ g.drawString(all.get(i), 18, 158) ; } if(i==8){ g.drawString(all.get(i), 70, 158) ; } if(i==9){ g.drawString(all.get(i), 115, 158) ; } } g.dispose() ; } /** * 将文字生成图片 * @param all * @param os * @throws IOException * @throws FontFormatException */ public static void write(List<String> all,OutputStream os) throws FontFormatException, IOException{ BufferedImage image =new BufferedImage(145 , 180, BufferedImage.TYPE_INT_BGR) ; Graphics2D g = image.createGraphics() ; //定义字体样式 //Font myFont = new Font("", Font.BOLD, 16); Font myFont = ValidateUtil.getFont(); myFont = myFont.deriveFont(Font.BOLD, 16); //设置字体 g.setFont(myFont) ; g.setColor(Color.WHITE) ; //绘制背景 g.fillRect(0, 0, 145 , 180) ; g.setColor(getRandomColor(180, 200)) ; drawRandomLines(g, 50,90,25) ; drawRandomString1(all, g) ; g.dispose() ; try { ImageIO.write(image, "JPEG", os) ; } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static Font getFont() throws FontFormatException, IOException { synchronized (ValidateUtil.class){ if(customFont == null){ Resource fontResource = new ClassPathResource("simhei.ttf"); customFont = Font.createFont(Font.TRUETYPE_FONT, fontResource.getInputStream()); } } return customFont; } /** * 生成指定长度的汉字 存放在数组里面 * @param length * @return */ private List<String> createFontsBylength(int length){ List<String> list = new ArrayList<String>(); for (int i = 0; i < length; i++) { list.add(createFont()); } return list; } }
最近下载更多
ggys0101001 LV3
2018年9月20日
123123zxl LV11
2018年6月26日
做你的英雄 LV14
2018年5月7日
gzcznb LV8
2018年4月11日
xuge191 LV16
2018年3月23日
来家乐 LV8
2018年3月1日
fenghuijun LV26
2017年12月1日
qianjin12346 LV1
2017年8月16日
微风一点 LV8
2017年7月11日
yjghdoug LV11
2017年6月18日
最近浏览更多
00x12300 LV19
2022年8月5日
18219194576 LV7
2021年11月24日
ma406805131 LV15
2020年6月29日
起名字是个麻烦事 LV12
2020年6月9日
xiaomanong1234
2020年6月6日
暂无贡献等级
wei112233 LV15
2020年4月20日
lt33333 LV7
2020年4月9日
奋斗的小蚂蚁 LV11
2020年2月10日
123hdhdhd LV10
2019年11月27日
hhhyyyrrr LV1
2019年11月8日