验证码图像 - ASP.NET

6

我正在制作自己网站的验证码检查。一切都正常,除了我需要添加一些对于网络爬虫等不可见的文本模糊/效果。

用于在图片上生成文本的一些代码:

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;

示例:

在此输入图片描述

我该怎么做才能让我的文本产生效果/模糊?

谢谢!


1
如果您正在寻找完整的解决方案,请查看此链接 - http://code.google.com/apis/recaptcha/docs/aspnet.html - jrummell
1
谢谢!但我已经有一个完整的解决方案可以使用了。 我非常想编写自己的代码。 - Birdman
4个回答

3
为什么要自己开发验证码,当免费的、可访问(通过音频选项,使其适用于视觉障碍人士)的reCAPTCHA可以帮助数字化各种出版物?甚至还有一个.NET实现编辑: 看起来这很有趣,看看“面向人类交互证明的ASP.NET框架”可能会给您一些好的想法。特别是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));
    }
}

这将以波浪形式移动像素。例如在您示例中的第二个单词。


4
因为那样的话,我就得一直依赖于 reCAPTCHA 的服务器。我想把它搬到我的服务器上。 - Birdman
但这值得吗?例如,您的网站对于视力受损的人是否像使用reCAPTCHA时那样易于访问?reCAPTCHA也支持音频验证。像Facebook和Ticketmaster这样的网站信任reCAPTCHA,因为它不会崩溃,并且它们在其后面有非常强大的设置。 - Johannes Kommer
目前,带有音频验证的部分并不重要- 这里最重要的是文本本身。 "简单"的解决方案并不总是制作一个"有趣"的解决方案。 - Birdman

1

看一下这个tutorial。在那里,您将找到一个使用C#和DrawString方法创建CAPTCHA的代码示例。

希望这可以帮助您。


这是一个非常好的教程..谢谢! - Birdman
@CanÜrek:谢谢。作为替代方案,您可以在此处使用以下代码:https://code.msdn.microsoft.com/Sample-of-a-simple-Captcha-f8c75c43 - Hans

0

0
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)
    {

    }
   
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接