ERP俱乐部
ERP爱好者、ERP从业者互相交流、互相学习的乐园;我们的愿景是成为全球一流的中文ERP(Enterprise Resource Planning)交流平台
网站首页
论坛首页
搜索
用户列表
FAQ
注册
登录
ERP俱乐部
->
Microsoft专栏
->
ASP.NET
->
在ASP.net中做验证码识别
在ASP.net中做验证码识别
帖子发起人:
半神
发起时间:
2008-12-06 12:22 下午
回复数:
3
楼主
2008-12-06, 12:22 下午
半神
职务: 超级管理员
等级: 80级
注册: 2008年1月6日
区域: 华南
经验: 1,267
积分: 1,131
精华: 2
发贴: 590
排名: 26
在ASP.net中做验证码识别
using
System;
using
System.Collections.Generic;
using
System.Text;
using
System.Collections;
using
System.Drawing;
using
System.Drawing.Imaging;
using
System.Runtime.InteropServices;
namespace
BallotAiying2
{
class
UnCodebase
{
public
Bitmap bmpobj;
public
UnCodebase(Bitmap pic)
{
bmpobj
=
new
Bitmap(pic);
//
转换为Format32bppRgb
}
/**/
///
<summary>
///
根据RGB,计算灰度值
///
</summary>
///
<param name="posClr">
Color值
</param>
///
<returns>
灰度值,整型
</returns>
private
int
GetGrayNumColor(System.Drawing.Color posClr)
{
return
(posClr.R
*
19595
+
posClr.G
*
38469
+
posClr.B
*
7472
)
>>
16
;
}
/**/
///
<summary>
///
灰度转换,逐点方式
///
</summary>
public
void
GrayByPixels()
{
for
(
int
i
=
0
; i
<
bmpobj.Height; i
++
)
{
for
(
int
j
=
0
; j
<
bmpobj.Width; j
++
)
{
int
tmpValue
=
GetGrayNumColor(bmpobj.GetPixel(j, i));
bmpobj.SetPixel(j, i, Color.FromArgb(tmpValue, tmpValue, tmpValue));
}
}
}
/**/
///
<summary>
///
去图形边框
///
</summary>
///
<param name="borderWidth"></param>
public
void
ClearPicBorder(
int
borderWidth)
{
for
(
int
i
=
0
; i
<
bmpobj.Height; i
++
)
{
for
(
int
j
=
0
; j
<
bmpobj.Width; j
++
)
{
if
(i
<
borderWidth
||
j
<
borderWidth
||
j
>
bmpobj.Width
-
1
-
borderWidth
||
i
>
bmpobj.Height
-
1
-
borderWidth)
bmpobj.SetPixel(j, i, Color.FromArgb(
255
,
255
,
255
));
}
}
}
/**/
///
<summary>
///
灰度转换,逐行方式
///
</summary>
public
void
GrayByLine()
{
Rectangle rec
=
new
Rectangle(
0
,
0
, bmpobj.Width, bmpobj.Height);
BitmapData bmpData
=
bmpobj.LockBits(rec, ImageLockMode.ReadWrite, bmpobj.PixelFormat);
//
PixelFormat.Format32bppPArgb);
//
bmpData.PixelFormat = PixelFormat.Format24bppRgb;
IntPtr scan0
=
bmpData.Scan0;
int
len
=
bmpobj.Width
*
bmpobj.Height;
int
[] pixels
=
new
int
[len];
Marshal.Copy(scan0, pixels,
0
, len);
//
对图片进行处理
int
GrayValue
=
0
;
for
(
int
i
=
0
; i
<
len; i
++
)
{
GrayValue
=
GetGrayNumColor(Color.FromArgb(pixels
));
pixels
=
(
byte
)(Color.FromArgb(GrayValue, GrayValue, GrayValue)).ToArgb();
//
Color转byte
}
bmpobj.UnlockBits(bmpData);
}
/**/
///
<summary>
///
得到有效图形并调整为可平均分割的大小
///
</summary>
///
<param name="dgGrayValue">
灰度背景分界值
</param>
///
<param name="CharsCount">
有效字符数
</param>
///
<returns></returns>
public
void
GetPicValidByValue(
int
dgGrayValue,
int
CharsCount)
{
int
posx1
=
bmpobj.Width;
int
posy1
=
bmpobj.Height;
int
posx2
=
0
;
int
posy2
=
0
;
for
(
int
i
=
0
; i
<
bmpobj.Height; i
++
)
//
找有效区
{
for
(
int
j
=
0
; j
<
bmpobj.Width; j
++
)
{
int
pixelValue
=
bmpobj.GetPixel(j, i).R;
if
(pixelValue
<
dgGrayValue)
//
根据灰度值
{
if
(posx1
>
j) posx1
=
j;
if
(posy1
>
i) posy1
=
i;
if
(posx2
<
j) posx2
=
j;
if
(posy2
<
i) posy2
=
i;
};
};
};
//
确保能整除
int
Span
=
CharsCount
-
(posx2
-
posx1
+
1
)
%
CharsCount;
//
可整除的差额数
if
(Span
<
CharsCount)
{
int
leftSpan
=
Span
/
2
;
//
分配到左边的空列 ,如span为单数,则右边比左边大1
if
(posx1
>
leftSpan)
posx1
=
posx1
-
leftSpan;
if
(posx2
+
Span
-
leftSpan
<
bmpobj.Width)
posx2
=
posx2
+
Span
-
leftSpan;
}
//
复制新图
Rectangle cloneRect
=
new
Rectangle(posx1, posy1, posx2
-
posx1
+
1
, posy2
-
posy1
+
1
);
bmpobj
=
bmpobj.Clone(cloneRect, bmpobj.PixelFormat);
}
/**/
///
<summary>
///
得到有效图形,图形为类变量
///
</summary>
///
<param name="dgGrayValue">
灰度背景分界值
</param>
///
<param name="CharsCount">
有效字符数
</param>
///
<returns></returns>
public
void
GetPicValidByValue(
int
dgGrayValue)
{
int
posx1
=
bmpobj.Width;
int
posy1
=
bmpobj.Height;
int
posx2
=
0
;
int
posy2
=
0
;
for
(
int
i
=
0
; i
<
bmpobj.Height; i
++
)
//
找有效区
{
for
(
int
j
=
0
; j
<
bmpobj.Width; j
++
)
{
int
pixelValue
=
bmpobj.GetPixel(j, i).R;
if
(pixelValue
<
dgGrayValue)
//
根据灰度值
{
if
(posx1
>
j) posx1
=
j;
if
(posy1
>
i) posy1
=
i;
if
(posx2
<
j) posx2
=
j;
if
(posy2
<
i) posy2
=
i;
};
};
};
//
复制新图
Rectangle cloneRect
=
new
Rectangle(posx1, posy1, posx2
-
posx1
+
1
, posy2
-
posy1
+
1
);
bmpobj
=
bmpobj.Clone(cloneRect, bmpobj.PixelFormat);
}
/**/
///
<summary>
///
得到有效图形,图形由外面传入
///
</summary>
///
<param name="dgGrayValue">
灰度背景分界值
</param>
///
<param name="CharsCount">
有效字符数
</param>
///
<returns></returns>
public
Bitmap GetPicValidByValue(Bitmap singlepic,
int
dgGrayValue)
{
int
posx1
=
singlepic.Width;
int
posy1
=
singlepic.Height;
int
posx2
=
0
;
int
posy2
=
0
;
for
(
int
i
=
0
; i
<
singlepic.Height; i
++
)
//
找有效区
{
for
(
int
j
=
0
; j
<
singlepic.Width; j
++
)
{
int
pixelValue
=
singlepic.GetPixel(j, i).R;
if
(pixelValue
<
dgGrayValue)
//
根据灰度值
{
if
(posx1
>
j) posx1
=
j;
if
(posy1
>
i) posy1
=
i;
if
(posx2
<
j) posx2
=
j;
if
(posy2
<
i) posy2
=
i;
};
};
};
//
复制新图
Rectangle cloneRect
=
new
Rectangle(posx1, posy1, posx2
-
posx1
+
1
, posy2
-
posy1
+
1
);
return
singlepic.Clone(cloneRect, singlepic.PixelFormat);
}
/**/
///
<summary>
///
平均分割图片
///
</summary>
///
<param name="RowNum">
水平上分割数
</param>
///
<param name="ColNum">
垂直上分割数
</param>
///
<returns>
分割好的图片数组
</returns>
public
Bitmap [] GetSplitPics(
int
RowNum,
int
ColNum)
{
if
(RowNum
==
0
||
ColNum
==
0
)
return
null
;
int
singW
=
bmpobj.Width
/
RowNum;
int
singH
=
bmpobj.Height
/
ColNum;
Bitmap [] PicArray
=
new
Bitmap[RowNum
*
ColNum];
Rectangle cloneRect;
for
(
int
i
=
0
; i
<
ColNum; i
++
)
//
找有效区
{
for
(
int
j
=
0
; j
<
RowNum; j
++
)
{
cloneRect
=
new
Rectangle(j
*
singW, i
*
singH, singW , singH);
PicArray[i
*
RowNum
+
j]
=
bmpobj.Clone(cloneRect, bmpobj.PixelFormat);
//
复制小块图
}
}
return
PicArray;
}
/**/
///
<summary>
///
返回灰度图片的点阵描述字串,1表示灰点,0表示背景
///
</summary>
///
<param name="singlepic">
灰度图
</param>
///
<param name="dgGrayValue">
背前景灰色界限
</param>
///
<returns></returns>
public
string
GetSingleBmpCode(Bitmap singlepic,
int
dgGrayValue)
{
Color piexl;
string
code
=
""
;
for
(
int
posy
=
0
; posy
<
singlepic.Height; posy
++
)
for
(
int
posx
=
0
; posx
<
singlepic.Width; posx
++
)
{
piexl
=
singlepic.GetPixel(posx, posy);
if
(piexl.R
<
dgGrayValue)
//
Color.Black )
code
=
code
+
"
1
"
;
else
code
=
code
+
"
0
"
;
}
return
code;
}
}
}
开源时代的到来,对与技术人员是一个巨大的考验
QQ:876162454
分享按钮
IP 地址: 已登录 来自: 已登录
第 2 楼
2008-12-06, 12:26 下午
半神
职务: 超级管理员
等级: 80级
注册: 2008年1月6日
区域: 华南
经验: 1,267
积分: 1,131
精华: 2
发贴: 590
排名: 26
Re: 在ASP.net中做验证码识别
上面的代码中有不清楚的地方请留言
开源时代的到来,对与技术人员是一个巨大的考验
QQ:876162454
IP 地址: 已登录 来自: 已登录
第 3 楼
2008-12-13, 04:19 下午
Steveson
等级: 100级
注册: 2007年11月13日
经验: 5,501
积分: 3,194
精华: 0
发贴: 2,866
排名: 4
Re: 在ASP.net中做验证码识别
什么时候开了ASP。NET的版啊
分享按钮
IP 地址: 已登录 来自: 已登录
第 4 楼
2008-12-16, 09:30 上午
半神
职务: 超级管理员
等级: 80级
注册: 2008年1月6日
区域: 华南
经验: 1,267
积分: 1,131
精华: 2
发贴: 590
排名: 26
Re: 在ASP.net中做验证码识别
为了给光大支持着提供技术交流平台,请大家up
开源时代的到来,对与技术人员是一个巨大的考验
QQ:876162454
IP 地址: 已登录 来自: 已登录
第 1 页 总共 1 页 [共有 4 条记录]
ERP俱乐部
->
Microsoft专栏
->
ASP.NET
->
在ASP.net中做验证码识别
请选择
论坛首页
─» 论坛搜索
─» 最新主题
─» 热门主题
─» 未回复的主题
用户选项
─» 登陆
─» 注册
─» 找回密码
SAP专栏
─» FI&CO(财务与会计)
─» MM(物料管理)
─» SD(销售与分销)
─» PP(生产计划)
─» WM、LE(物流、仓库、发运)
─» QM(质量管理)
─» PS(项目系统)
─» PM(工厂维护)
─» HR(人力资源)
─» BASIS
─» ABAP
─» SAP Business Intelligence(数据仓库)
─» SAP BUSINESS ONE
─» SAP Netweaver
─» SAP Solutions
─» CRM(Customer Relationship Management客户关系管理)
─» Workflow
─» SAP综合讨论版块
─» HANA(High-Performance Analytic Appliance)
Oracle Applications专栏
─» Oracle E-Business Suite
─» PeopleSoft Enterprise
─» Siebel
─» JD Edwards
─» Hyperion
Microsoft专栏
─» 亚可审批工作流、CRM专栏
─» Visual C#
─» ASP.NET
UFIDA专栏
─» 用友
Kingdee专栏
─» 金蝶
数据库专栏
─» Oracle数据库
─» Oracle入门与认证
─» Oracle开发
─» MS SQL Server数据库
─» DB2数据库
会员交流
─» 培训专栏
─» 休闲与娱乐
─» 招聘与求职
─» SAP新闻
─» 供求专区
─» 海阔天空
信息化建设讨论组
─» PLM
─» IT规划及CIO
─» ERP
─» 数据仓库与数据挖掘
管理员及版主
─» 问题报告
站务管理
─» 站点公告及意见建议
(C)Copyright 2005-2020
www.erpclub.org
All Rights Reserved.
Tel:+86-755-26444630
Email:webmaster@yok.com.cn