下面就是识别部份的代码:
/*
* ImageCode.java
*
* Created on 2007年1月18日, 下午10:00
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package net.bccn.hadeslee.programfan;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
import java.net.URL;
import javax.imageio.ImageIO;
/**
* 验证码识别程序
* @author hadeslee
*/
public class ImageCode {
private BufferedImage bi;
private static int[][][] model=new int[5][10][208];
//静态初始化块
static{
initNumModel();
}
/**
* Creates a new instance of ImageCode
*/
public ImageCode() {
initNumModel();
}
public String getNumber(InputStream is){
try{
bi= ImageIO.read( is );
final StringBuffer sb=new StringBuffer();
for(int i=0; i<4; i++){
int[] data=this.getData(i);
sb.append(this.doCheck(data));
}
return sb.toString();
} catch(Exception exe){
exe.printStackTrace();
return "";
}
}
/**
* 重载的方法,根据传进来的参数得到返回的字符串
* @param bi
* @return 结果
*/
public String getNumber(BufferedImage bi){
try{
this.bi= bi;
StringBuffer sb=new StringBuffer();
for(int i=0; i<4; i++){
int[] data=this.getData(i);
sb.append(this.doCheck(data));
}
//System.out.println(sb.toString());
return sb.toString();
} catch(Exception exe){
exe.printStackTrace();
return "";
}
}
/**
* 静态初始化方法,
* 用于初始化字模
*/
private static void initNumModel(){
try{
//System.out.println("初始化model");
for(int i=0; i<10; i++){
StreamTokenizer st=new StreamTokenizer(new InputStreamReader(ImageCode.class.getResourceAsStream("/net/bccn/hadeslee/model/programfan_"+i+".mod")));
st.whitespaceChars('#','#');
st.whitespaceChars(',',',');
st.eolIsSignificant(false);
out:while(true){
int token=st.nextToken();
if(token==StreamTokenizer.TT_WORD){
int who=0;
int index=0;
if(st.sval.equals("center")){
who=0;
}else if(st.sval.equals("left")){
who=1;
}else if(st.sval.equals("right")){
who=2;
}else if(st.sval.equals("up")){
who=3;
}else if(st.sval.equals("down")){
who=4;
}
while(st.nextToken()==StreamTokenizer.TT_NUMBER){
model[who][i][index++]=(int)st.nval;
}
st.pushBack();
}else if(token==StreamTokenizer.TT_EOF){
break out;
}
}
}
} catch(Exception exe){
exe.printStackTrace();
}
//System.out.println("初始化结束model");
}
//通过传进来的字符串得到BufferedImage对象
private BufferedImage getBI(String url){
try {
return ImageIO.read(new URL(url));
} catch (IOException ex) {
ex.printStackTrace();
return null;
}
}
/**根据索引得到
*某一块的图像转为数组
*的文件
*/
private int[] getData(int index){
BufferedImage sub=bi.getSubimage(index*16,0,16,13);
int iw=sub.getWidth();
int ih=sub.getHeight();
int[] demo=new int[iw*ih];
for(int i=0; i for(int j=0; j demo[i*iw+j]=(sub.getRGB(j,i)==-1?0:1);

