第一个问题:验证码不是单个数字,一般是4个数字。(你登陆进来的时候不是看到了)哪么就要进行拆分,拆成四部分,或者N部分(高宽适中)
第二个问题:对每个部分进行比较(每个部分是可以生成新的图片的)或者你用其它方式进行比较。得到是哪个数字。
第三个问题:自己的验证码特征库的建立。各个部分的特征
第四个问题:把第一个问题拆成哪四个部分,去掉多余的部分,好刚特征库的比较
第五个问题:验证码过小,放大。过大缩小,有没有人还可以补充的。(或者其它的解决方案)
每个部分的函数实现也有分加油吧 路过的朋友.....不懂得,不要顶啊 重复不要,QQ验证码的识别哪个也不要,已经知道了,用C# 或 vb.net + GDI+

解决方案 »

  1.   

    //建立位图对象
    Bitmap newBitmap = new Bitmap(36,16,PixelFormat.Format32bppArgb);
    //根据上面创建的位图对象创建绘图面
    Graphics g = Graphics.FromImage(newBitmap);
    //以指定的颜色填充矩形区
    g.FillRectangle(new SolidBrush(Color.White), new Rectangle(0,0,36,16));
    //创建字体对象
    Font textFont = new Font("Times New Roman",10);
    //创建RectangleF结构指定一个区域
    RectangleF rectangle = new RectangleF(0,0,36,16);
    //创建随机数对象
    Random rd = new Random();
    //取得随机数
    int valationNo = 1000 + rd.Next(8999);
    //使用指定的颜色填充上面RectangleF结构指定的矩形区域
    g.FillRectangle(new SolidBrush(Color.BurlyWood), rectangle);
    //在上面填充的矩形区域中填充上面生成的随机数
    g.DrawString(valationNo.ToString(), textFont, new SolidBrush(Color.Blue), rectangle);
    //把创建的位图保存到指定的路径
    newBitmap.Save(Server.MapPath("img")+"\\VaImg.gif", ImageFormat.Gif);
      

  2.   

    http://www.cnblogs.com/gwazy/archive/2005/04/18/139510.html
      

  3.   

    /* Copyright all(c) 2005 ZhongFeng, http://blog.csdn.net/SW515 */
     public class ValidateCode : System.Web.UI.Page
     {
      private void Page_Load(object sender, System.EventArgs e)
      {
       this.CreateCheckCodeImage(GenerateCheckCode());
      }  #region Web 窗体设计器生成的代码
      override protected void OnInit(EventArgs e)
      {
       //
       // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
       //
       InitializeComponent();
       base.OnInit(e);
      }
      
      /// <summary>
      /// 设计器支持所需的方法 - 不要使用代码编辑器修改
      /// 此方法的内容。
      /// </summary>
      private void InitializeComponent()
      {    
       this.Load += new System.EventHandler(this.Page_Load);
      }
      #endregion  private string GenerateCheckCode()
      {
       int number;
       char code;
       string checkCode = String.Empty;   System.Random random = new Random();   for(int i=0; i<5; i++)
       {
        number = random.Next();    if(number % 2 == 0)
         code = (char)('0' + (char)(number % 10));
        else
         code = (char)('A' + (char)(number % 26));    checkCode += code.ToString();
       }   Response.Cookies.Add(new HttpCookie("CheckCode", checkCode));   return checkCode;
      }  private void CreateCheckCodeImage(string checkCode)
      {
       if(checkCode == null || checkCode.Trim() == String.Empty)
        return;   System.Drawing.Bitmap image = new System.Drawing.Bitmap((int)Math.Ceiling((checkCode.Length * 12.5)), 22);
       Graphics g = Graphics.FromImage(image);   try
       {
        //生成随机生成器
        Random random = new Random();    //清空图片背景色
        g.Clear(Color.White);    //画图片的背景噪音线
        for(int i=0; i<25; i++)
        {
         int x1 = random.Next(image.Width);
         int x2 = random.Next(image.Width);
         int y1 = random.Next(image.Height);
         int y2 = random.Next(image.Height);     g.DrawLine(new Pen(Color.Silver), x1, y1, x2, y2);
        }    Font font = new System.Drawing.Font("Arial", 12, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
        System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.DarkRed, 1.2f, true);
        g.DrawString(checkCode, font, brush, 2, 2);    //画图片的前景噪音点
        for(int i=0; i<100; i++)
        {
         int x = random.Next(image.Width);
         int y = random.Next(image.Height);     image.SetPixel(x, y, Color.FromArgb(random.Next()));
        }    //画图片的边框线
        g.DrawRectangle(new Pen(Color.Silver), 0, 0, image.Width - 1, image.Height - 1);    System.IO.MemoryStream ms = new System.IO.MemoryStream();
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
        Response.ClearContent();
        Response.ContentType = "image/Gif";
        Response.BinaryWrite(ms.ToArray());
       }
       finally
       {
        g.Dispose();
        image.Dispose();
       }
      }
     }
        假如以上验证码生成器页面名为:CheckCode.aspx,那么在登录页面中使用“<IMG>” 这个 HTML 元素来显示生成的验证码图片:<IMG src="CheckCode.aspx">
      在登录页面的登录按钮的处理事件中使用以下代码判断验证码:
      private void btnLogin_Click(object sender, System.Web.UI.ImageClickEventArgs e)
      {
       if(Request.Cookies["CheckCode"] == null)
       {
        lblMessage.Text = "您的浏览器设置已被禁用 Cookies,您必须设置浏览器允许使用 Cookies 选项后才能使用本系统。";
        lblMessage.Visible = true;
        return;
       }    if(String.Compare(Request.Cookies["CheckCode"].Value, txtCheckCode.Text, true) != 0)
       {
        lblMessage.Text = "验证码错误,请输入正确的验证码。";
        lblMessage.Visible = true;
        return;
       }        /*****  其他代码  *****/  }
      

  4.   

    现在可以谈谈,智能型的。哪些扭曲等等....ocr有这方面的资料吗
      

  5.   

    re:LoveCherry 
    是啊所以现在考虑得智能方面的了
      

  6.   

    http://dev.csdn.net/develop/article/22/22618.shtmhttp://www.cnblogs.com/hover/articles/1283.aspx
      

  7.   

    有一些现成的可以参考参考,.TEXT的源代码可以看看,另外GMAIL的那个注册页面看过吗?就是你要的效果,具体怎么做的不清楚.
      

  8.   

    验证码自动生成N位随机数的一个例子:
    public string CutStr(string str,int n)//可能是让返回的字符串占N个字节
    {
    string ss="";//返回值
    if (str.Length<=n/2)
    {
    ss=str;
    }
    else
    {
    int t=0;
    char[] tmp=str.ToCharArray();
    for (int i=0;i<str.Length;i++)
    {
    int c;
    //c=Convert.ToInt32(str.Substring(i,1));
    c=(int)tmp[i];
    if (c<0)
    c=c+65536;
    if (c>255)
    t=t+2;
    else
    t=t+1;
    if (t>n)
    break;
    ss=ss+str.Substring(i,1);
    }
    }
    return ss; } public string CutStrWithD(string str,int n)
    {
    string ss="";//返回值
    if (str.Length<=n/2)
    {
    ss=str;
    }
    else
    {
    int t=0;
    char[] tmp=str.ToCharArray();
    for (int i=0;i<str.Length;i++)
    {
    int c;
    //c=Convert.ToInt32(str.Substring(i,1));
    c=(int)tmp[i];
    if (c<0)
    c=c+65536;
    if (c>255)
    t=t+2;
    else
    t=t+1;
    if (t>n)
    break;
    ss=ss+str.Substring(i,1);
    }
    ss=ss+"...";
    }
    return ss;
    }
      

  9.   

    '这个是VB的代码。谁要呢。现在要的是智能点的分析。谢谢 Function DownImg(ByVal StrUrl As String) As String
            Console.WriteLine(System.Threading.Thread.CurrentThread.Name & ":下载验证码。。")
            Dim Rqq As HttpWebRequest = HttpWebRequest.Create(StrUrl)
            Rqq.CookieContainer = New CookieContainer
            'Me.l_res.Text = "获取并识别验证码"
            'Me.l_res.Refresh()
            Dim RPP As HttpWebResponse = Rqq.GetResponse        Dim Img As New System.Drawing.Bitmap(RPP.GetResponseStream)        _APSNET_SessionValue = RPP.Cookies("ASP.NET_SessionId").Value        Dim B As Bitmap
            Dim B1 As Bitmap
            Dim B2 As Bitmap
            Dim B3 As Bitmap
            Dim B4 As Bitmap        Dim Rc1 As New Rectangle(3, 4, 8, 12)
            Dim Rc2 As New Rectangle(12, 4, 8, 12)
            Dim Rc3 As New Rectangle(21, 4, 8, 12)
            Dim Rc4 As New Rectangle(30, 4, 8, 12)
            B = Img        B1 = B.Clone(Rc1, B.PixelFormat)
            'Me.l_res.Text = "获取并识别验证码:1"
            'Me.l_res.Refresh()
            B2 = B.Clone(Rc2, B.PixelFormat)
            'Me.l_res.Text = "获取并识别验证码:2"
            'Me.l_res.Refresh()
            B3 = B.Clone(Rc3, B.PixelFormat)
            'Me.l_res.Text = "获取并识别验证码:3"
            'Me.l_res.Refresh()
            B4 = B.Clone(Rc4, B.PixelFormat)
            'Me.l_res.Text = "获取并识别验证码:4"
            'Me.l_res.Refresh()        Dim StrCode As String
            Try
                StrCode = getNo(B1) + getNo(B2) + getNo(B3) + getNo(B4)
                'Me.Text = (StrCode)
            Catch ex As Exception
                Console.WriteLine(ex.Message)
            Finally
                B.Dispose()
                B1.Dispose()
                B2.Dispose()
                B3.Dispose()
                B4.Dispose()        End Try
            '释放资源        Return StrCode
        End Function
        Function getNo(ByVal Img As Bitmap) As String
            Dim Ic As Int32 = 0
            Dim A As ArrayList        Ic = 0
            A = New ArrayList
            A.Add(New Point(0, 2))
            A.Add(New Point(0, 3))
            A.Add(New Point(0, 4))
            A.Add(New Point(0, 5))
            A.Add(New Point(0, 6))
            A.Add(New Point(0, 7))
            A.Add(New Point(0, 8))
            A.Add(New Point(0, 9))
            A.Add(New Point(1, 1))
            A.Add(New Point(1, 10))
            A.Add(New Point(2, 0))
            A.Add(New Point(2, 11))
            A.Add(New Point(3, 0))
            A.Add(New Point(3, 11))
            A.Add(New Point(4, 0))
            A.Add(New Point(4, 11))
            A.Add(New Point(5, 0))
            A.Add(New Point(5, 11))
            A.Add(New Point(6, 1))
            A.Add(New Point(6, 10))
            A.Add(New Point(7, 2))
            A.Add(New Point(7, 3))
            A.Add(New Point(7, 4))
            A.Add(New Point(7, 5))
            A.Add(New Point(7, 6))
            A.Add(New Point(7, 7))
            A.Add(New Point(7, 8))
            A.Add(New Point(7, 9))        For Each p As Point In A
                If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
                    Ic += 1
                End If
            Next
            If Ic = A.Count Then
                Return "0"
            End If
            '====================================        Ic = 0
            A = New ArrayList
            A.Add(New Point(2, 2))
            A.Add(New Point(2, 11))
            A.Add(New Point(3, 2))
            A.Add(New Point(3, 11))
            A.Add(New Point(4, 0))
            A.Add(New Point(4, 1))
            A.Add(New Point(4, 2))
            A.Add(New Point(4, 3))
            A.Add(New Point(4, 4))
            A.Add(New Point(4, 5))
            A.Add(New Point(4, 6))
            A.Add(New Point(4, 7))
            A.Add(New Point(4, 8))
            A.Add(New Point(4, 9))
            A.Add(New Point(4, 10))
            A.Add(New Point(4, 11))
            A.Add(New Point(5, 11))
            A.Add(New Point(6, 11))        For Each p As Point In A
                If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
                    Ic += 1
                End If
            Next
            If Ic = A.Count Then
                Return "1"
            End If
            '====================================        Ic = 0
            A = New ArrayList
            A.Add(New Point(1, 1))
            A.Add(New Point(1, 10))
            A.Add(New Point(1, 11))
            A.Add(New Point(2, 0))
            A.Add(New Point(2, 9))
            A.Add(New Point(2, 11))
            A.Add(New Point(3, 0))
            A.Add(New Point(3, 8))
            A.Add(New Point(3, 11))
            A.Add(New Point(4, 0))
            A.Add(New Point(4, 7))
            A.Add(New Point(4, 11))
            A.Add(New Point(5, 0))
            A.Add(New Point(5, 6))
            A.Add(New Point(5, 11))
            A.Add(New Point(6, 1))
            A.Add(New Point(6, 5))
            A.Add(New Point(6, 11))
            A.Add(New Point(7, 2))
            A.Add(New Point(7, 3))
            A.Add(New Point(7, 4))
            A.Add(New Point(7, 11))        For Each p As Point In A
                If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
                    Ic += 1
                End If
            Next
            If Ic = A.Count Then
                Return "2"
            End If
            '====================================
            Ic = 0
            A = New ArrayList
            A.Add(New Point(0, 2))
            A.Add(New Point(0, 3))
            A.Add(New Point(0, 7))
            A.Add(New Point(0, 8))
            A.Add(New Point(0, 9))
            A.Add(New Point(1, 1))
            A.Add(New Point(1, 4))
            A.Add(New Point(1, 6))
            A.Add(New Point(1, 10))
            A.Add(New Point(2, 0))
            A.Add(New Point(2, 5))
            A.Add(New Point(2, 11))
            A.Add(New Point(3, 0))
            A.Add(New Point(3, 5))
            A.Add(New Point(3, 11))
            A.Add(New Point(4, 0))
            A.Add(New Point(4, 5))
            A.Add(New Point(4, 11))
            A.Add(New Point(5, 0))
            A.Add(New Point(5, 5))
            A.Add(New Point(5, 11))
            A.Add(New Point(6, 1))
            A.Add(New Point(6, 4))
            A.Add(New Point(6, 6))
            A.Add(New Point(6, 10))
            A.Add(New Point(7, 2))
            A.Add(New Point(7, 3))
            A.Add(New Point(7, 7))
            A.Add(New Point(7, 8))
            A.Add(New Point(7, 9))        For Each p As Point In A
                If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
                    Ic += 1
                End If
            Next
            If Ic = A.Count Then
                Return "8"
            End If
      

  10.   

    '====================================
            Ic = 0
            A = New ArrayList
            A.Add(New Point(1, 1))
            A.Add(New Point(1, 10))
            A.Add(New Point(2, 0))
            A.Add(New Point(2, 11))
            A.Add(New Point(3, 0))
            A.Add(New Point(3, 5))
            A.Add(New Point(3, 11))
            A.Add(New Point(4, 0))
            A.Add(New Point(4, 5))
            A.Add(New Point(4, 11))
            A.Add(New Point(5, 0))
            A.Add(New Point(5, 5))
            A.Add(New Point(5, 11))
            A.Add(New Point(6, 1))
            A.Add(New Point(6, 4))
            A.Add(New Point(6, 6))
            A.Add(New Point(6, 10))
            A.Add(New Point(7, 2))
            A.Add(New Point(7, 3))
            A.Add(New Point(7, 7))
            A.Add(New Point(7, 8))
            A.Add(New Point(7, 9))        For Each p As Point In A
                If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
                    Ic += 1
                End If
            Next
            If Ic = A.Count Then
                Return "3"
            End If
            '====================================        Ic = 0
            A = New ArrayList
            A.Add(New Point(0, 6))
            A.Add(New Point(0, 7))
            A.Add(New Point(1, 5))
            A.Add(New Point(1, 7))
            A.Add(New Point(2, 4))
            A.Add(New Point(2, 7))
            A.Add(New Point(3, 3))
            A.Add(New Point(3, 7))
            A.Add(New Point(4, 2))
            A.Add(New Point(4, 7))
            A.Add(New Point(5, 1))
            A.Add(New Point(5, 7))
            A.Add(New Point(6, 0))
            A.Add(New Point(6, 1))
            A.Add(New Point(6, 2))
            A.Add(New Point(6, 3))
            A.Add(New Point(6, 4))
            A.Add(New Point(6, 5))
            A.Add(New Point(6, 6))
            A.Add(New Point(6, 7))
            A.Add(New Point(6, 8))
            A.Add(New Point(6, 9))
            A.Add(New Point(6, 10))
            A.Add(New Point(6, 11))
            A.Add(New Point(7, 7))
            For Each p As Point In A
                If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
                    Ic += 1
                End If
            Next
            If Ic = A.Count Then
                Return "4"
            End If
            '====================================        Ic = 0
            A = New ArrayList
            A.Add(New Point(1, 0))
            A.Add(New Point(1, 1))
            A.Add(New Point(1, 2))
            A.Add(New Point(1, 3))
            A.Add(New Point(1, 4))
            A.Add(New Point(1, 10))
            A.Add(New Point(2, 0))
            A.Add(New Point(2, 4))
            A.Add(New Point(2, 11))
            A.Add(New Point(3, 0))
            A.Add(New Point(3, 4))
            A.Add(New Point(3, 11))
            A.Add(New Point(4, 0))
            A.Add(New Point(4, 4))
            A.Add(New Point(4, 11))
            A.Add(New Point(5, 0))
            A.Add(New Point(5, 4))
            A.Add(New Point(5, 11))
            A.Add(New Point(6, 0))
            A.Add(New Point(6, 5))
            A.Add(New Point(6, 10))
            A.Add(New Point(7, 0))
            A.Add(New Point(7, 6))
            A.Add(New Point(7, 7))
            A.Add(New Point(7, 8))
            A.Add(New Point(7, 9))        For Each p As Point In A
                If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
                    Ic += 1
                End If
            Next
            If Ic = A.Count Then
                Return "5"
            End If
            '====================================        Ic = 0
            A = New ArrayList
            A.Add(New Point(0, 3))
            A.Add(New Point(0, 4))
            A.Add(New Point(0, 5))
            A.Add(New Point(0, 6))
            A.Add(New Point(0, 7))
            A.Add(New Point(0, 8))
            A.Add(New Point(0, 9))
            A.Add(New Point(1, 2))
            A.Add(New Point(1, 5))
            A.Add(New Point(1, 10))
            A.Add(New Point(2, 1))
            A.Add(New Point(2, 4))
            A.Add(New Point(2, 11))
            A.Add(New Point(3, 0))
            A.Add(New Point(3, 4))
            A.Add(New Point(3, 11))
            A.Add(New Point(4, 0))
            A.Add(New Point(4, 4))
            A.Add(New Point(4, 11))
            A.Add(New Point(5, 0))
            A.Add(New Point(5, 4))
            A.Add(New Point(5, 11))
            A.Add(New Point(6, 0))
            A.Add(New Point(6, 5))
            A.Add(New Point(6, 10))
            A.Add(New Point(7, 6))
            A.Add(New Point(7, 7))
            A.Add(New Point(7, 8))
            A.Add(New Point(7, 9))        For Each p As Point In A
                If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
                    Ic += 1
                End If
            Next
            If Ic = A.Count Then
                Return "6"
            End If
            '====================================        Ic = 0
            A = New ArrayList
            A.Add(New Point(1, 0))
            A.Add(New Point(2, 0))
            A.Add(New Point(2, 10))
            A.Add(New Point(2, 11))
            A.Add(New Point(3, 0))
            A.Add(New Point(3, 8))
            A.Add(New Point(3, 9))
            A.Add(New Point(4, 0))
            A.Add(New Point(4, 6))
            A.Add(New Point(4, 7))
            A.Add(New Point(5, 0))
            A.Add(New Point(5, 4))
            A.Add(New Point(5, 5))
            A.Add(New Point(6, 0))
            A.Add(New Point(6, 2))
            A.Add(New Point(6, 3))
            A.Add(New Point(7, 0))
            A.Add(New Point(7, 1))        For Each p As Point In A
                If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
                    Ic += 1
                End If
            Next
            If Ic = A.Count Then
                Return "7"
            End If
            '====================================        Ic = 0
            A = New ArrayList
            A.Add(New Point(0, 2))
            A.Add(New Point(0, 3))
            A.Add(New Point(0, 4))
            A.Add(New Point(0, 5))
            A.Add(New Point(1, 1))
            A.Add(New Point(1, 6))
            A.Add(New Point(1, 11))
            A.Add(New Point(2, 0))
            A.Add(New Point(2, 7))
            A.Add(New Point(2, 11))
            A.Add(New Point(3, 0))
            A.Add(New Point(3, 7))
            A.Add(New Point(3, 11))
            A.Add(New Point(4, 0))
            A.Add(New Point(4, 7))
            A.Add(New Point(4, 11))
            A.Add(New Point(5, 0))
            A.Add(New Point(5, 7))
            A.Add(New Point(5, 10))
            A.Add(New Point(6, 1))
            A.Add(New Point(6, 6))
            A.Add(New Point(6, 9))
            A.Add(New Point(7, 2))
            A.Add(New Point(7, 3))
            A.Add(New Point(7, 4))
            A.Add(New Point(7, 5))
            A.Add(New Point(7, 6))
            A.Add(New Point(7, 7))
            A.Add(New Point(7, 8))
            For Each p As Point In A
                If Img.GetPixel(p.X, p.Y).ToArgb = Color.Blue.ToArgb Then
                    Ic += 1
                End If
            Next
            If Ic = A.Count Then
                Return "9"
            End If
            '====================================        Return " "
        End Function