注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

北漂的小羊

Java编程,开发者,程序员,软件开发,编程,代码。新浪微博号:IT国子监

 
 
 

日志

 
 
关于我

在这里是面向程序员的高品质IT技术学习社区,是程序员学习成长的地方。让我们更好地用技术改变世界。请关注新浪微博号: IT国子监(http://weibo.com/itguozijian)

网易考拉推荐

java简单图片、验证码识别源码(数字验证码识别器)  

2012-12-14 12:42:54|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
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;   
  
/**  
* 数字验证码识别器(用于识别xxx系统的图片验证码)  
*   
* 算法如下: 分析验证码图片结构,将其分隔成4个独立的数字图片,把四个独立的数字图片处理成单色位图。   
* 把单色位图转换为0、1数组,然后分别和0-9的字模进行匹配,得到图片上的数字信息。  
*    
* @since JDK 1.5.0_8  
*/  
public class NumberVerCodeIdentifier {   
       
    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; 
        
    }   
  
    /**  
     * 单色位图转换 
     * @return  
     */  
    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;   
    }   
  
    /**  
     * 测试  
     * @author  sunyang 
     */  
    public static void main(String args[]){   
     
     NumberVerCodeIdentifier nvi = new NumberVerCodeIdentifier(); 
     
     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);   
    }   

  评论这张
 
阅读(1599)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016