现在用c#做程序越来越流行了,很多人都将它作为了自己的第一编程语言,因为它的方便快速的开发能力得到了不少人的青睐。使用C#进行验证码的识别有许多种方法,
下面是一段C#写成的验证码识别程序,里面用到了一些技巧,其实做过的人都知道,不太清楚的看一下代码,注释都给出来了,很好理解的。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.IO;
using System.Configuration;
namespace ConsoleApplication4
{
/// <summary>
/// 根据样本做验证码破解
///
/// 需要在.config文件中的appSettings配置节中添加key为sampleOcr.sampleDir value设置为样本图片所在路径
/// 验证码:https://investorservice.cfmmc.com/https://investorservice.cfmmc.com/veriCode.do?t=1335521167762&ip=202.99.16.22
///
/// outofmemory.cn 20120427
/// 100个样例准确数为88个,错误主要发生在389这三个字符的混淆上
/// </summary>
public abstract class SampleOcr
{
/// <summary>
/// 灰度中间值
/// </summary>
static int MiddleGrayValue =200;
/// <summary>
/// 分割图片的差异容忍度
/// </summary>
static int ColorToleranceForSplit = 30;
/// <summary>
/// 样本字典
/// </summary>
static Dictionary<string, Bitmap> _samples;
/// <summary>
/// 破解验证码
/// </summary>
/// <param name="bm">验证码图片</param>
/// <returns>验证码文本</returns>
public static string Ocr(Bitmap bm)
{
//做灰度处理
GrayByPixels(bm);
bm =RemoveVerticalSpaceRegion(bm);
Bitmap[] splitBms =SplitBitmaps(bm);
char[] result = newchar[splitBms.Length];
for (int i = 0; i <splitBms.Length; i++)
{
result[i] =OcrChar(splitBms[i]);
splitBms[i].Dispose();
}
return new string(result);
}
/// <summary>
/// 分割图片
/// </summary>
/// <param name="bm">图片</param>
/// <returns>分割后的图片对象</returns>
static Bitmap[] SplitBitmaps(Bitmap bm)
{
//找出垂直分割线
List<int> removeXs = newList<int>();
for (int x = 0; x <bm.Width; x++)
{
bool hasDiffPoint =false;
Color color =Color.White;
for (int y = 0; y <bm.Height; y++)
{
if (y == 0)
{