那个高手用JAVA实现过识别图片验证码的JAVA原程序?

xxjoyjn 2005-11-12 11:52:11
那个高手用JAVA实现过识别图片验证码的JAVA原程序?20分全部奉送!
...全文
1690 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
yagumo 2005-11-13
  • 打赏
  • 举报
回复
我第一句话就说了要看图片的复杂程序,不晓得你是没看到还是故意无视.还有,referer才叫小儿科,这些东西一个setRequestProperty就搞定了.
shine333 2005-11-13
  • 打赏
  • 举报
回复
楼上的太小儿科了,

人家随便来点背景噪音,font的name, style, size每个都不一样,再来点英文,你怎么办?

别的不说,

我在这个生成这个图像的程序里面加上检查Http Request的header参数中的referer(也就是这个<img src>标签包含在哪个网页中),只有来自我自己网站的网页的img的请求,我才接受,你怎么办?
yagumo 2005-11-13
  • 打赏
  • 举报
回复
那倒也不一定,关系是看验证图片的复杂程序,我写了个CSDN的识图程序,方法很简单,比较图的像素值,因为CSDN的数字是不变的.

package yagumo;

import java.net.*;
import java.awt.image.*;
import java.awt.*;
import java.io.*;
import javax.imageio.*;

/**
* <p>Title: 八云测试用例</p>
*
* <p>Description: 将CSDN的登陆验证图片转换为数字</p>
*
* <p>Copyright: Copyright (c) 2004</p>
*
* <p>Company: </p>
*
* @author yagumo
* @version 1.0
*/
public class ImgIdent {
private int intImgWith;
private int IntImgHeight;
private int intBgColor;
private int intCharColor;
private int intMinX;
private int intMaxX;
private int intMinY;
private int intMaxY;
private String strNum;
private BufferedImage img;
//座标原点
private Point pOrigin;
//字框宽
private int intCharWidth = 8;
//字框高
private int intCharHeight = 12;
//字框横向间隙
private int intCharSpaceH = 1;
//字框纵向间隙
private int intCharSpaceY = 1;
//数字字符比特表
private final long[][] NUMERIC = {{0x3C4281818181L, 0x81818181423CL}, //'0'
{0X080838080808L, 0X08080808083EL}, //'1'
{0x3C4201010102L, 0x04081020407FL}, //'2'
{0x3C420101021CL, 0x02010101423CL}, //'3'
{0x02060A122242L, 0x82FF02020202L}, //'4'
{0x7F4040407C02L, 0x01010101423CL}, //'5'
{0x1E204080BCC2L, 0x81818181423CL}, //'6'
{0x7F0102020404L, 0x080810102020L}, //'7'
{0x3C428181423CL, 0x42818181423CL}, //'8'
{0x3C4281818181L, 0x433D01020478L}}; //'9'

/**
* 构造函数
* @param url URL 远程文件
* @throws IOException
*/
public ImgIdent(URL url) throws IOException {
img = ImageIO.read(url);
init();
}

/**
* 构造函数
* @param file File 本地文件
* @throws IOException
*/
public ImgIdent(File file) throws IOException {
img = ImageIO.read(file);
init();
}

/**
* 类初始工作
*/
private void init() {
//得到图象的长度和宽度
intImgWith = img.getWidth();
IntImgHeight = img.getHeight();
//得到图象的背景颜色
intBgColor = img.getRGB(0, 0);
//初始化图象原点座标
pOrigin = new Point(3, 4);
}
private void getBaseInfo() {
System.out.println(intBgColor + "|" + intCharColor);
System.out.println(intMinX + "|" + intMinY + "|" + intMaxX + "|" + intMaxY);
}

/**
* 得到字符的左上右下点座标
* @param intNo int 第n个字符
* @return int[]
*/
private Point[] getCharRange(int intNo) {
//左上右下点座标
Point pTopLeft = new Point(0, 0);
Point pBottomRight = new Point(0, 0);
//左上点
pTopLeft.x = pOrigin.x + intCharWidth * (intNo - 1) + intCharSpaceH * (intNo -1);
pTopLeft.y = pOrigin.y;
//右下点
pBottomRight.x = pOrigin.x + intCharWidth * intNo + intCharSpaceH * (intNo -1) - 1;
pBottomRight.y = pOrigin.y + intCharHeight - 1;

return new Point[] {pTopLeft, pBottomRight};
}

/**
* 与背景颜色比较返回相应的字符
* @param x int 横座标
* @param y int 纵座标
* @return char 返回字符
*/
private char getBit(int x, int y) {
int intCurtColor;
intCurtColor = img.getRGB(x, y);
return (intCurtColor == intBgColor)? '0': '1';
}

/**
* 得到第n个字符对应的字符串
* @param intNo int 第n个字符
* @return String 代表字符位的串
*/
private String getCharString(int intNo) {
//本字符的左上右下点座标
Point[] p = getCharRange(intNo);
Point pTopLeft = p[0];
Point pBottomRight = p[1];
//换算边界值
int intX1, intY1, intX2, intY2;
intX1 = pTopLeft.x;
intY1 = pTopLeft.y;
intX2 = pBottomRight.x;
intY2 = pBottomRight.y;
//在边界内循环取象素
int i, j;
String strChar = "";
for (i = intY1; i <= intY2; i++) {
for (j = intX1; j <= intX2; j++) {
strChar = strChar + getBit(j, i);
}
}

return strChar;
}

/**
* 得到第n个字符对应数值
* @param intNo int 第n个字符
* @return int 对应数值
*/
public int getNum(int intNo) {
//取得位字符串
String strChar = getCharString(intNo);
//取得串高位串和低位串
String strCharHigh = strChar.substring(0, strChar.length() / 2);
String strCharLow = strChar.substring(strChar.length() / 2);
//计算高位和低位值
long lCharHigh = Long.parseLong(strCharHigh, 2);
long lCharLow = Long.parseLong(strCharLow, 2);
//在数字中循环比较
int intNum = '*';
for (int i = 0; i <= 9; i++) {
if (lCharHigh == NUMERIC[i][0] && lCharLow == NUMERIC[i][1]) {
intNum = i;
break;
}
}

return intNum;
}

public static void main(String[] args) {
try {
// ImgIdent imgIdent = new ImgIdent(new File("d:/temp/5.gif"));
ImgIdent imgIdent = new ImgIdent(new URL("http://www.csdn.net/member/ShowExPwd.aspx"));
String strNum = "";
for (int i = 1; i <= 4; i++) {
strNum += String.valueOf(imgIdent.getNum(i));
}
System.out.println("结果是: " + strNum);
}
catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
}
treeroot 2005-11-12
  • 打赏
  • 举报
回复
200分估计也没人写的出来

62,629

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧