【问题标题】:Captcha image - ASP.NET验证码图像 - ASP.NET
【发布时间】:2011-12-15 22:02:13
【问题描述】:

我正在我的网站上进行自己的验证码检查。 一切正常,除了我需要对我的文本进行一些网络爬虫等无法查看的模糊/效果。

用于在图片上生成文字的部分代码:

Bitmap BitMap = new Bitmap(@"C:\Users\Public\Pictures\Sample Pictures\Desert.jpg");
Graphics g = Graphics.FromImage(BitMap);
g.DrawString(""+RandomNumberString+"", new Font("Tahoma", 40), Brushes.Khaki, new PointF(1, 1));
pictureBox1.Image = BitMap;

例子:

我可以做些什么来让我的文字产生效果/模糊?

谢谢!

【问题讨论】:

标签: c# asp.net captcha


【解决方案1】:
protected void Page_Load(object sender, EventArgs e)
{
    if(! IsPostBack)
    {
        LoadCaptcha();[![enter image description here][1]][1]
    }
    
}

public void LoadCaptcha()
{
    try
    {
        Bitmap objBitmap = new Bitmap(130, 60);
        Graphics objGraphics = Graphics.FromImage(objBitmap);
        objGraphics.Clear(Color.White);
        Random objRandom = new Random();
        objGraphics.DrawLine(Pens.Black, objRandom.Next(0, 50), objRandom.Next(10, 30), objRandom.Next(0, 200), objRandom.Next(0, 50));
        objGraphics.DrawRectangle(Pens.Blue, objRandom.Next(0, 20), objRandom.Next(0, 20), objRandom.Next(50, 80), objRandom.Next(0, 20));
        objGraphics.DrawLine(Pens.Blue, objRandom.Next(0, 20), objRandom.Next(10, 50), objRandom.Next(100, 200), objRandom.Next(0, 80));
        Brush objBrush =
            default(Brush);
        //create background style  
        HatchStyle[] aHatchStyles = new HatchStyle[]
        {
            HatchStyle.BackwardDiagonal, HatchStyle.Cross, HatchStyle.DashedDownwardDiagonal, HatchStyle.DashedHorizontal, HatchStyle.DashedUpwardDiagonal, HatchStyle.DashedVertical,
                HatchStyle.DiagonalBrick, HatchStyle.DiagonalCross, HatchStyle.Divot, HatchStyle.DottedDiamond, HatchStyle.DottedGrid, HatchStyle.ForwardDiagonal, HatchStyle.Horizontal,
                HatchStyle.HorizontalBrick, HatchStyle.LargeCheckerBoard, HatchStyle.LargeConfetti, HatchStyle.LargeGrid, HatchStyle.LightDownwardDiagonal, HatchStyle.LightHorizontal
        };
        ////create rectangular area  
        RectangleF oRectangleF = new RectangleF(0, 0, 300, 300);
        objBrush = new HatchBrush(aHatchStyles[objRandom.Next(aHatchStyles.Length - 3)], Color.FromArgb((objRandom.Next(100, 255)), (objRandom.Next(100, 255)), (objRandom.Next(100, 255))), Color.White);
        objGraphics.FillRectangle(objBrush, oRectangleF);
        //Generate the image for captcha  
        string captchaText = string.Format("{0:X}", objRandom.Next(1000000, 9999999));
        //add the captcha value in session  
        Session["CaptchaVerify"] = captchaText;
        Font objFont = new Font("Courier New", 15, FontStyle.Bold);
        //Draw the image for captcha  
        objGraphics.DrawString(captchaText, objFont, Brushes.Black, 20, 20);
        //  objBitmap.Save(HttpContext.Current.Response.OutputStream, ImageFormat.Gif);
        byte[] _bytes;
        using (MemoryStream ms = new MemoryStream())
        {
            objBitmap.Save(ms, ImageFormat.Bmp);
            _bytes = ms.ToArray();
        }
        imgcaptcha.ImageUrl = "data:image;base64," + Convert.ToBase64String(_bytes);
        ImageCapchaSubmit.ImageUrl = "data:image;base64," + Convert.ToBase64String(_bytes);
    }
    catch (Exception)
    {

    }
   
}

【讨论】:

    【解决方案2】:

    reCAPTCHA 是免费的、可访问的(通过音频选项,使其可供有视觉问题的人使用)并且同时有助于将各种出版物数字化时,为什么要推出您自己的验证码?甚至还有.NET implementation

    编辑:

    看看它的乐趣,看看“An ASP.NET Framework for Human Interactive Proofs”可能会给你一些好主意。特别是ImageHipChallenge,因为它包含图像失真代码示例。

    例如:

    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            int newX = (int)(x + (distortion * Math.Sin(Math.PI * y / 64.0)));
            int newY = (int)(y + (distortion * Math.Cos(Math.PI * x / 64.0)));
            if (newX < 0 || newX >= width) newX = 0;
            if (newY < 0 || newY >= height) newY = 0;
            b.SetPixel(x, y, copy.GetPixel(newX, newY));
        }
    }
    

    这将像波浪一样移动像素。比如你的例子的第二个词。

    【讨论】:

    • 因为那时我将依赖 reCAPTCHA 的服务器一直在运行。我想把它放在我的服务器本地。
    • 值得权衡吗?例如,您的网站是否像 reCAPTCHA 一样可供视障人士访问?哪个也支持音频验证?例如,Facebook 和 Ticketmaster trust reCAPTCHA 等网站不要倒闭,他们的设置非常强大。
    • 目前音频验证部分并不重要——这里重要的是文本本身。 “简单”的解决方案并不总是“有趣”的解决方案。
    【解决方案3】:

    我已经使用了大约 5 年,它不涉及与可怕的 3rd 方 API 的任何集成。

    http://www.codeproject.com/KB/aspnet/CaptchaImage.aspx

    【讨论】:

      【解决方案4】:

      看看这个tutorial。在那里,您将找到有关如何使用 C# 和 DrawString 方法创建验证码的代码示例。

      希望,这会有所帮助。

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多