首页>代码>java高仿百度贴吧九宫格验证码代码下载>/九宫格验证码/java文件/ValidateUtil.java
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日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友