`
ljl_xyf
  • 浏览: 636024 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

C#验证码识别类

    博客分类:
  • c#
阅读更多
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[i]));
                pixels[i] = (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;
        }
    }
}
 

 

分享到:
评论

相关推荐

    c#验证码识别类源码

    C#验证码识别类源码提供了在.NET框架下实现验证码识别的功能。以下是对这个源码的一些详细解释和相关知识点: 1. **验证码基础**:验证码(CAPTCHA)是“全自动区分计算机和人类的图灵测试”(Completely Automated...

    简单C#验证码识别类

    在本主题中,我们关注的是一个简单的C#验证码识别类,尽管它可能无法应对现代复杂的验证码,但对于初学者来说,这是一个很好的起点,可以帮助他们理解图像处理和模式识别的基本概念。 C#是一种面向对象的编程语言,...

    c# 验证码识别 OCR图片识别 准确率非常高

    总之,这个项目为我们提供了一个深入理解验证码识别和C#编程实践的机会,同时也展示了如何将图像处理和机器学习技术应用于实际问题中。对于想要提升这方面技能的开发者,这是一个很好的学习资源。

    C#验证码识别源码

    总之,"C#验证码识别源码"是一个有价值的教育资源,对于想要深入理解和应用验证码识别技术的C#开发者来说,这是一个宝贵的参考资料。通过学习和实践,不仅可以掌握验证码识别的基本原理,还能加深对C#编程和计算机...

    C#验证码识别类完整实例

    本文实例讲述了C#验证码识别类。分享给大家供大家参考。具体实现方法如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Drawing; using System.Drawing...

    C# 验证码识别基础方法及源码

    总结来说,C#验证码识别基础方法涉及到图像处理、模式识别和深度学习等多个领域的知识。通过学习和理解提供的源码,开发者不仅可以掌握验证码识别的基本原理,还能提升在C#中处理图像和应用机器学习的能力。在实际...

    c# 验证码识别源代码

    只要你有一定的c#编程基础,只要半天时间仔细阅读这份代码,你就可以从完全不懂验证码识别的菜鸟变成一个能破解一些傻瓜验证码的高手。 希望尊重他人劳动成果,不要上传此代码到别的地方。谢谢!

    C# 验证码识别多种图像噪处理

    C#作为一种强大的编程语言,提供了丰富的库和工具来处理图像处理任务,包括验证码识别中的图像去噪。本项目聚焦于通过多种图像噪声处理方法提升验证码识别的准确性。 1. **噪声模型**:在图像处理中,噪声是指图像...

    C#验证码识别

    7. **代码结构**:一个完整的C#验证码识别程序通常包括读取图像、图像预处理、字符分割、模板匹配、相似度计算和结果输出等模块。代码会使用如`System.Drawing`库进行图像处理,以及自定义算法进行模板匹配。 总之...

    C#源码图片验证码识别

    二、C#验证码识别技术 1. 基本步骤 - 图像预处理:包括灰度化、二值化、去噪、边缘检测等,目的是简化图像,突出验证码字符。 - 字符分割:通过连通组件分析,找到各个字符的边界,将其分离。 - 特征提取:提取...

    C#识别验证码

    本项目"用C#实现验证码识别"是基于Visual Studio 2005开发的,下面将详细介绍这个领域的相关知识点。 1. **C#语言基础**: C#是一种面向对象的编程语言,由微软公司推出,主要用于.NET框架。在VS2005环境下,C#...

    c#识别验证码,识别验证码

    c#识别验证码c#识别验证码c#识别验证码c#识别验证码c#识别验证码c#识别验证码c#识别验证码c#识别验证码

    C# 验证码识别程序

    本项目名为"C# 验证码识别程序",旨在帮助开发者理解和实践验证码识别的原理与方法。 验证码的主要目的是防止恶意自动化的机器人或爬虫进行非法操作,例如批量注册、恶意登录等。常见的验证码类型有数字字母组合、...

    C#验证码识别模块

    要使用这个C#验证码识别模块,开发者需要根据`readme.html`中的指导,配置环境,编译源代码,然后将识别模块集成到自己的应用中。通过调用提供的API,可以将验证码识别功能无缝集成到C#应用程序中,从而自动化处理...

    C#验证码识别参考算法

    C#验证码识别参考算法

    使用C#的aforge类库识别验证码实例

    总结来说,AForge.NET为C#开发者提供了一套强大且灵活的工具,用于处理图像识别任务,包括验证码识别。通过理解并熟练运用其中的类库,我们可以构建出高效、准确的验证码识别系统。后续的学习和实践,将进一步深入到...

    Captcha_C#_识别_验证码识别_

    本项目聚焦于C#/.NET平台下的验证码识别,旨在提供高效且准确的解决方案。 验证码(CAPTCHA)是“Completely Automated Public Turing test to tell Computers and Humans Apart”的缩写,即全自动区分计算机和人类...

Global site tag (gtag.js) - Google Analytics