VerifiDecoder.java
上传用户:qingzhou
上传日期:2013-04-21
资源大小:733k
文件大小:9k
源码类别:

破解

开发平台:

Java

  1. package gxhpjx;
  2. import java.awt.Dimension;
  3. import java.awt.Rectangle;
  4. import magick.ImageInfo;
  5. import magick.MagickImage;
  6. import magick.MagickException;
  7. import magick.QuantizeInfo;
  8. import magick.ColorspaceType;
  9. import magick.MagickApiException;
  10. import magick.PixelPacket;
  11. import magick.DrawInfo;
  12. import magick.ResolutionType;
  13. import magick.ProfileInfo;
  14. import magick.MontageInfo;
  15. import magick.Magick;
  16. import magick.MagickInfo;
  17. import java.io.File;
  18. import java.io.IOException;
  19. import java.io.FileOutputStream;
  20. import java.net.URI;
  21. import java.util.Calendar;
  22. import javax.imageio.*;
  23. import java.net.URL;
  24. import java.awt.image.*;
  25. /** 
  26.  * For decoding the verification codes at the website http://www.chsi.com.cn 
  27.  * Only for your reference and please do NOT use it for any illegal or 
  28.  * commerce activity.
  29.  *   
  30.  * @author Dodo  zengl@ics.ict.ac.cn  Dec 14,2005
  31.  */
  32. public class VerifiDecoder {
  33. private final int pixel_diff = 50000;   //象素差 default to 50000
  34. private final int class_threshold = 70;//分类阈值 default to 70
  35. private final int code_length = 4;      //验证码长度 default to 4
  36. /*
  37.  * Param1: String templatePath 模板库路径
  38.  * Param2: String inputPath 输入路径
  39.  * Param3: String inputFileName 输入文件名称
  40.  * Param4: int code[] 存储匹配结果
  41.  * 
  42.  * return: true if and only if decoding is successful, false otherwise.
  43.  */
  44. public boolean decode(String templatePath,String inputPath,String inputFileName,int code[]){
  45.     try {       
  46.             System.out.println("输入路径为:"+inputPath + inputFileName);
  47.     ImageInfo inputInfo = new ImageInfo(inputPath + inputFileName);        
  48.                  
  49.          //切分坐标系        
  50.             Rectangle rect[] = { new Rectangle(1, 1, 20, 17),new Rectangle(20, 1, 20, 17),
  51.                               new Rectangle(38, 1, 15, 17), new Rectangle(54, 1, 15, 17)
  52. };
  53.             PixelPacket templetPPacket = null; //切分后的模板象素包
  54.             PixelPacket inputPPacket = null; //切分后的待匹配象素包            
  55.             
  56.             Calendar startTime = Calendar.getInstance();//计时
  57.             int m = 1;
  58.             for(; m<=code_length; m++){
  59.             
  60.              MagickImage inputImage = new MagickImage(inputInfo);
  61.              inputImage = inputImage.cropImage(rect[m-1]);//切分待匹配矩形
  62.             
  63.              for (int n=0; n<=9; n++){
  64.                     String templateFileName = m + "_" + n + ".jpg";//模板图片文件
  65.                     ImageInfo templetInfo = new ImageInfo(templatePath + templateFileName);                   
  66.                     
  67.                     MagickImage templetImage = new MagickImage(templetInfo);
  68.                     templetImage = templetImage.cropImage(rect[m-1]);//切分模板矩形
  69.                     
  70.                     int i,j=0,k=0;            
  71.                     for (i=1; i <= 59; i++) {
  72.                      for (j=1; j<=14; j++) {//default to i<=59 j<=14
  73.                      templetPPacket = templetImage.getOnePixel(i,j);//获取模板x,y象素包
  74.                      inputPPacket = inputImage.getOnePixel(i,j);
  75.                     
  76.                      if (Math.abs(templetPPacket.getRed()-inputPPacket.getRed())>=pixel_diff
  77.                      & Math.abs(templetPPacket.getGreen()-inputPPacket.getGreen())>=pixel_diff
  78.          & Math.abs(templetPPacket.getBlue()-inputPPacket.getBlue())>=pixel_diff
  79.                      ){
  80.                      k++;//统计相异象素包                    
  81.                      }            
  82.                      }
  83.                     }
  84.                     if (k < class_threshold) {//匹配成功
  85.                      code[m-1] = n;//存储匹配结果
  86.                     System.out.println("模板文件:"+templatePath+templateFileName + "n待匹配文件:"+inputPath+inputFileName);        
  87.          System.out.println("行:i=" + i + "    列:j=" + j + "    相异点个数:k=" + k);
  88.          System.out.println("模板第" + m + "位: " + n + "   输入:" + n + "n");         
  89.          break;//跳出循环,取消该位上的匹配
  90.                     }
  91.              }            
  92.             }
  93.             Calendar endTime = Calendar.getInstance();//计时
  94.             System.out.print("--------------------------------------n验证码识别结果:");
  95.             if (m>code_length){            
  96.              for (int i=0; i<code_length; i++){
  97.              System.out.print(code[i]);
  98.             }
  99.              System.out.print(" [成功] ");
  100.              System.out.println("  用时:"+ (endTime.getTimeInMillis() - startTime.getTimeInMillis()) + " 毫秒n");
  101.             return true;
  102.             }else {              
  103.              System.out.println(" [失败] n");            
  104.             }   
  105.         }
  106.         catch (MagickApiException ex) {
  107.             System.err.println("MagickException: " + ex + ": " + ex.getReason()
  108.                     + ", " + ex.getDescription());
  109.             ex.printStackTrace();
  110.         }
  111.         catch (MagickException ex) {
  112.             System.err.println("MagickException: " + ex);
  113.             ex.printStackTrace();
  114.         }
  115.         return false;
  116.     }
  117. /*
  118.  * 提供Facade方法封装decoding过程
  119.  * 
  120.  * */
  121. public String facade(String templatePath, String inputPath, String inputFileName, URL url)throws Exception{
  122.      int code[] = {0,0,0,0}; //匹配结果         
  123.      BufferedImage image = ImageIO.read(url);
  124.      ImageIO.write(image,"JPEG",new File(inputPath+inputFileName));//从网站上读取输入验证码,保存至本地
  125.     
  126.      VerifiDecoder vd = new VerifiDecoder();
  127.      vd.decode(templatePath,inputPath,inputFileName,code);
  128.     
  129.      String res = "";
  130.      for (int i = 0; i<code.length; i++){
  131.      res = res + code[i];
  132.      }
  133.      return res;
  134. }
  135. /**
  136.  * 重载facade方法,直接访问本地已获取的验证码图片
  137.  *  
  138.  * */
  139. public String facade(String templatePath, String inputPath, String inputFileName)throws Exception{
  140.      int code[] = {0,0,0,0}; //匹配结果         
  141.     
  142.      VerifiDecoder vd = new VerifiDecoder();
  143.      vd.decode(templatePath,inputPath,inputFileName,code);
  144.     
  145.      String res = "";
  146.      for (int i = 0; i<code.length; i++){
  147.      res = res + code[i];
  148.      }
  149.      return res;
  150. }
  151. /*
  152.  * 查找Base目录下及其下一级子目录下的特定文件
  153.  * 
  154.  * Param1: String baseDir 根目录
  155.  * Param2: String fileInCache 要在缓冲中查找的目标文件名匹配关键字  
  156.  * Param3: String newFileName 转移后的目标文件名及路径
  157.  * return: String[] 由于IE缓存目录Contend.IE5目录下的几个目录是随机生成的,所以
  158.  *         需要搜寻验证码所在的某个子目录,并把该子目录及图片名称以字符串数组形式返回   
  159.  * */
  160. public String[] findFile(String baseDir, String fileInCache, String newPathFile){
  161. String[] res = {"",""};
  162. try{
  163. File file = new File(baseDir);
  164. File inputFile = new File(newPathFile);
  165. if (file.exists()) {
  166. int i,k = 1;
  167. //while (k<=1){//轮循直到要查找的文件在IE缓存中出现
  168. System.out.print("*");
  169. for (i = 0; i< file.list().length; i++){
  170. int j;
  171. if (file.listFiles()[i].isDirectory()){ //子目录
  172. //System.out.println("查询目录:"+file.listFiles()[i]);
  173. for (j = 0; j < file.listFiles()[i].list().length; j++){
  174. File subfile = file.listFiles()[i].listFiles()[j];//子子目录
  175. if (subfile.isFile()&& subfile.getName().startsWith(fileInCache)){
  176. res[0] = subfile.getParent().substring(subfile.getParent().lastIndexOf("\")+1);
  177. res[1] = subfile.getName();//缓冲中的文件名
  178. System.out.println("n===== OK! 找到第[" + k + "]张  "+ subfile.getName()+"  位于:"+ res[0] + " ===== ");
  179. if (inputFile.exists()){
  180. if (!inputFile.delete())
  181. System.out.println("目标目录中的旧图片删除失败!");
  182. }
  183. if (subfile.renameTo(inputFile))//转移缓存中的所有验证图片
  184. System.out.println("转移成功!n");
  185. else System.out.println("转移失败!n");
  186. k++;
  187. }
  188. }
  189. }
  190. //}
  191. }
  192. }
  193. }
  194.   catch(Exception e){
  195.    e.printStackTrace();
  196.  }
  197. return res;
  198. }
  199.     public static void main(String[] args) throws Exception{   
  200.      String templatePath = "D:\trash\template\";
  201.      String inputPath = templatePath;
  202.      String inputFileName = "ValidatorIMG.jpg";//待匹配图片文件:ValidatorIMG
  203.      int code[] = {0,0,0,0}; //匹配结果
  204.      URL url = new URL("http://www.chsi.com.cn/ValidatorIMG.JPG?ID=" + Math.random()*10000);    
  205.      BufferedImage image = ImageIO.read(url);
  206.      ImageIO.write(image,"JPEG",new File(templatePath+inputFileName));//从网站上读取输入验证码,保存至本地
  207.     
  208.      VerifiDecoder vd = new VerifiDecoder();
  209.      vd.decode(templatePath,inputPath,inputFileName,code);
  210.     }
  211. }