数字验证码识别器

import java.awt.Graphics;      
import java.awt.Image;      
import java.awt.image.BufferedImage;      
import java.io.ByteArrayInputStream;      
import java.io.File;      
import java.io.IOException;    
import java.io.InputStream;      
import java.net.MalformedURLException;    
import java.net.URL;    
     
import javax.imageio.ImageIO;      
import javax.media.jai.JAI;      
import javax.media.jai.RenderedOp;      
     
/**    
18.* 数字验证码识别器(用于识别xxx系统的图片验证码)    
19.*     
20.* 算法如下: 分析验证码图片结构,将其分隔成4个独立的数字图片,把四个独立的数字图片处理成单色位图。     
21.* 把单色位图转换为0、1数组,然后分别和0-9的字模进行匹配,得到图片上的数字信息。    
22.*     
23.* @version 1.0 2009-7-7    
24.* @author huangyuanmu    
25.* @since JDK 1.5.0_8    
26.*/     
public class test {      
          
    static     
    {      
         System.setProperty("com.sun.media.jai.disableMediaLib", "true");      
   }      
     
//字典    
    private static String a0 = "000111100";    
    private static String a1 = "001111110";    
       
    private static String a2 = "011111110";    
    private static String a22 = "011011000";    
       
    private static String a3 = "001111100";    
    private static String a4 = "000000110";    
       
   private static String a5 = "111111111";//前    
    private static String a52 = "011111111";//前    
   private static String a53 = "001011000";//后    
       
   private static String a6 = "000111100000111100";    
    private static String a7 = "001100000";    
    private static String a8 = "001111100000111100";    
   private static String a9 = "001111000";    


   public String recognize(BufferedImage image){    
     
    String result = "";    
        
        
       BufferedImage newim[] = new BufferedImage[4];      
       if(null == image){      
            throw new RuntimeException("iamage为null");      
        }      
       // 将图像分成四块,因为要处理的文件有四个数字。      
        newim[0] = generateSingleColorBitMap(image.getSubimage(7, 5, 8, 11));      
        newim[1] = generateSingleColorBitMap(image.getSubimage(20, 5, 8, 11));      
        newim[2] = generateSingleColorBitMap(image.getSubimage(33, 5, 8, 11));      
        newim[3] = generateSingleColorBitMap(image.getSubimage(46, 5, 8, 11));      
          
        for (int k = 0; k < 4; k++) {    
            int iw = newim[k].getWidth(null);      
           int ih = newim[k].getHeight(null);      
        
           StringBuffer numstr = new StringBuffer();    
            // 因为是二值图像,这里的方法将像素读取出来的同时,转换为0,1的图像数组。      
            for (int i = 0; i < ih; i++) {      
                for (int j = 0; j < iw; j++) {     
                    
               int t = newim[k].getRGB(j, i);    
                   if (t == -1)      
                   numstr.append("0");      
                   else     
                    numstr.append("1");;    
                   
                }      
            }      
            // 得到像匹配的数字串。      
               
              
            String straaa = numstr.toString().substring(0, 9) + numstr.toString().substring(79);    
           // System.out.println(numstr.toString());    
               
            boolean bye = true;    
            if(straaa.equals(a6))    
            {    
             result = result+6;    
             //System.out.println(6);    
            bye = false;    
            }    
           if(straaa.equals(a8))    
           {    
             result = result+8;    
            //System.out.println(8);    
             bye = false;    
           }    
                          
         if(numstr.toString().substring(0,9).equals(a5) || numstr.toString().substring(0,9).equals(a52) || numstr.toString().substring(79).equals(a53)){    
         result = result+5;    
          //System.out.println(5);    
       bye = false;    
     }    
               
         String aaaaa = numstr.toString().substring(79);    
           
           if(bye){    
            if(aaaaa.equals(a0)){    
            result = result+0;    
             //System.out.println(0);    
             }    
                
            if(aaaaa.equals(a1)){    
              result = result+1;//System.out.println(1);    
            }    
             if(aaaaa.equals(a2) || aaaaa.equals(a22)){    
             result = result+2;//System.out.println(2);    
            }    
            if(aaaaa.equals(a3)){    
            result = result+3;//System.out.println(3);    
             }    
                
            if(aaaaa.equals(a4)){    
             result = result+4;// System.out.println(4);    
             }               
                
           if(aaaaa.equals(a7)){    
             result = result+7;//System.out.println(7);    
             }    
             
           if(aaaaa.equals(a9)){    
              result = result+9;//System.out.println(9);    
            }               
            }    
             
            
       }      
      // System.out.println(result);    
        return result;    
           
    }      
     
    /**    
151.     * 单色位图转换   
152.     * @return    
153.     */     
    private static BufferedImage generateSingleColorBitMap(Image colorImage) {      
        BufferedImage image = new BufferedImage(8, 11,      BufferedImage.TYPE_BYTE_GRAY);      
        Graphics g = image.getGraphics();      
        g.drawImage(colorImage, 0, 0, null);      
       g.dispose();      
        RenderedOp ro = JAI.create("binarize", image, new Double(100));      
        BufferedImage bi = ro.getAsBufferedImage();      
        return bi;      
    }      
     
    /**    
166.     * 测试    
167.     * @author  sunyang   
168.     */     
    public static void main(String args[]){      
        
     test nvi = new test();    
        
     String res="";    
 try {    
  res = nvi.recognize(ImageIO.read(new File("d:\\111.bmp")));    
     
 //res = nvi.recognize(ImageIO.read(new URL("http://******.com/validationCode.jsp")));    
 } catch (MalformedURLException e) {    
  // TODO Auto-generated catch block    
 e.printStackTrace();    
 } catch (IOException e) {    
 // TODO Auto-generated catch block    
 e.printStackTrace();    
}      
        System.out.println(res);      
    }      
}   
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值