社区
Java SE
帖子详情
那个高手用JAVA实现过识别图片验证码的JAVA原程序?
xxjoyjn
2005-11-12 11:52:11
那个高手用JAVA实现过识别图片验证码的JAVA原程序?20分全部奉送!
...全文
1690
4
打赏
收藏
那个高手用JAVA实现过识别图片验证码的JAVA原程序?
那个高手用JAVA实现过识别图片验证码的JAVA原程序?20分全部奉送!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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分估计也没人写的出来
java
识别
图片验证码
的2种方式
包含5个
识别
图片验证码
的类,分别对应不同5种不同的验证码 其中用了两种不同的
实现
方式(截取采样像素比对+Tesseract-OCR
识别
) 附带一个图像指纹类(判定图片相似度)和一个寻找联通线的类(八皇后算法
实现
)
Java
使用OCR技术
识别
验证码
实现
自动化登陆方法
在本篇文章里小编给大家分享的是关于
Java
如何使用 OCR 技术
识别
验证码
实现
自动化登陆的相关知识点内容,需要的朋友们学习下。
Java
简单验证码
识别
(附源码)
java
验证码
识别
JAVA
知识巩固 源码
java
验证码
识别
java
验证码
识别
java
实现
识别
验证码程序
这是我在业余时间用
java
语言
实现
的验证码
识别
功能,其中用到OCR工具,这个需要提前下载安装,不懂的童鞋自行google之。
java
验证码
识别
源程序
java
验证码
识别
源程序 windows版本 概率90%以上
Java SE
62,629
社区成员
307,258
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章