Click here to Skip to main content
Click here to Skip to main content
Technical Blog

Captcha Image using C# in ASP.NET

, 22 Mar 2011 CPOL
Rate this:
Please Sign up or sign in to vote.
Captcha Image using C# in ASP.NET

Download - 131.44 KB

What is Captcha Image? 

Source:DotNet Stuff   


If both match then displays above message 


If both doesn't match then display above message 

In the web, whenever you register on any site, normally they ask at the end of page for entering Image code/Challenge Image/Image verification code, etc. This type of image is called Captcha Image.

What is the Use of Captcha?


Captcha is a type of challenge-response test used in computing to ensure that the response is not generated by a computer. The process usually involves one computer (a server) asking a user to complete a simple test which the computer is able to generate and grade. Because other computers are unable to solve the CAPTCHA, any user entering a correct solution is presumed to be human.

A best technique to restrict automatic form submissions when developing a web page is to add some kind of verification. As per my knowledge, image verification is the best way, it’s also called Captcha image. In this process, dynamically we are creating an image with random string either string, number or alphanumeric and displaying it on the web page. After that, at the time of form submission, the user is asked to enter the same code in the text box as shown in that image. Once the form is submitted, then we can compare both auto generated value and entered by user because there is no other good way to protect your webworms from spammers (auto submission).

How Can We Do That?

Here is the detailed explanation with code snippets.

This is the default.aspx (partially):

<asp:Label ID="lblmsg" runat="server" Font-Bold="True" 
	ForeColor="Red" Text=""></asp:Label>
         <br />
    <asp:TextBox ID="txtimgcode" runat="server"></asp:TextBox>
    <br />
    <asp:Image ID="Image1" runat="server" ImageUrl="~/CImage.aspx"/>
    <br />
    <asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />

In the above code, there are three control Label controls to display message whether entered code is matched or not, TextBox to take input from user and Image box to hold an image autogenerated by CImage.aspx page. Before that, we will see default.aspx.cs page code:

protected void Button1_Click(object sender, EventArgs e)
        if (this.txtimgcode.Text == this.Session["CaptchaImageText"].ToString())
            lblmsg.Text = "Excellent.......";
            lblmsg.Text = "image code is not valid.";
        this.txtimgcode.Text = "";

In button’s click event, we are just checking entered value with stored value in session. And we display the appropriate message on the screen.

CImage.aspx Page

Remove all the code except the first line.

The main code is here which is calling a method to generate random number string and passes it to the class file which will generate image with the same string and return it as a JPEG format.

Here are the details of the code:

using System.Drawing.Imaging;
public partial class CImage : System.Web.UI.Page
    protected void Page_Load(object sender, EventArgs e)
        // Create a random code and store it in the Session object.
        this.Session["CaptchaImageText"] = GenerateRandomCode();
        // Create a CAPTCHA image using the text stored in the Session object.
        RandomImage ci = new RandomImage(this.Session
			["CaptchaImageText"].ToString(), 300, 75);
        // Change the response headers to output a JPEG image.
        this.Response.ContentType = "image/jpeg";
        // Write the image to the response stream in JPEG format.
        ci.Image.Save(this.Response.OutputStream, ImageFormat.Jpeg);
        // Dispose of the CAPTCHA image object.
    // Function to generate random string with Random class.
    private string GenerateRandomCode()
        Random r = new Random();
        string s = "";
        for (int j = 0; j < 5;j++)
            int i = r.Next(3);
            int ch;
            switch (i)
                case 1:
                    ch = r.Next(0, 9);
                    s = s + ch.ToString();
                case 2:
                    ch = r.Next(65, 90);
                    s = s + Convert.ToChar(ch).ToString();
                case 3:
                    ch = r.Next(97, 122);
                    s = s + Convert.ToChar(ch).ToString();
                    ch = r.Next(97, 122);
                    s = s + Convert.ToChar(ch).ToString();
            r.Next(100, 1999);
        return s;

And finally, the code for RandomImage class which generates Image with the help of BitMap class.

//Extra name space
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
public class RandomImage
//Default Constructor 
      public RandomImage(){}
      public string Text
            get { return this.text; }
    public Bitmap Image
        get { return this.image; }
    public int Width
        get { return this.width; }
    public int Height
        get { return this.height; }
//Private variable
    private string text;
    private int width;
    private int height;
    private Bitmap image;
    private Random random = new Random();
    //Methods declaration
    public RandomImage(string s, int width, int height)
          this.text = s;
          this.SetDimensions(width, height);
    public void Dispose()
    protected virtual void Dispose(bool disposing)
        if (disposing)
    private void SetDimensions(int width, int height)
          if (width <= 0)
                throw new ArgumentOutOfRangeException("width", width, 
                    "Argument out of range, must be greater than zero.");
          if (height <= 0)
                throw new ArgumentOutOfRangeException("height", height, 
                    "Argument out of range, must be greater than zero.");
          this.width = width;
          this.height = height;
    private void GenerateImage()
          Bitmap bitmap = new Bitmap
			(this.width, this.height, PixelFormat.Format32bppArgb);
          Graphics g = Graphics.FromImage(bitmap);
          g.SmoothingMode = SmoothingMode.AntiAlias;
          Rectangle rect = new Rectangle(0, 0, this.width, this.height);
          HatchBrush hatchBrush = new HatchBrush(HatchStyle.SmallConfetti,
              Color.LightGray, Color.White);
          g.FillRectangle(hatchBrush, rect);
          SizeF size;
          float fontSize = rect.Height + 1;
        Font font;
            font = new Font(FontFamily.GenericSansSerif, fontSize, FontStyle.Bold);
                size = g.MeasureString(this.text, font);
          } while (size.Width > rect.Width);
          StringFormat format = new StringFormat();
          format.Alignment = StringAlignment.Center;
          format.LineAlignment = StringAlignment.Center;
          GraphicsPath path = new GraphicsPath();
          //path.AddString(this.text, font.FontFamily, (int) font.Style, 
          //    font.Size, rect, format);
        path.AddString(this.text, font.FontFamily, (int)font.Style, 75, rect, format);
          float v = 4F;
          PointF[] points =
                new PointF(this.random.Next(rect.Width) / v, this.random.Next(
                   rect.Height) / v),
                new PointF(rect.Width - this.random.Next(rect.Width) / v, 
                    this.random.Next(rect.Height) / v),
                new PointF(this.random.Next(rect.Width) / v, 
                    rect.Height - this.random.Next(rect.Height) / v),
                new PointF(rect.Width - this.random.Next(rect.Width) / v,
                    rect.Height - this.random.Next(rect.Height) / v)
          Matrix matrix = new Matrix();
          matrix.Translate(0F, 0F);
          path.Warp(points, rect, matrix, WarpMode.Perspective, 0F);
          hatchBrush = new HatchBrush(HatchStyle.Percent10, Color.Black, Color.SkyBlue);
          g.FillPath(hatchBrush, path);
          int m = Math.Max(rect.Width, rect.Height);
          for (int i = 0; i < (int) (rect.Width * rect.Height / 30F); i++)
                int x = this.random.Next(rect.Width);
                int y = this.random.Next(rect.Height);
                int w = this.random.Next(m / 50);
                int h = this.random.Next(m / 50);
                g.FillEllipse(hatchBrush, x, y, w, h);
          this.image = bitmap;

Happy Coding...


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Tarun Dudhatra
Software Developer Working in Ahmedabad, Gujarat, India
India India

I am working as a Software Engineer in Ahmedabad, Gujrat, India.

I have 7+ Years of Experience in Microsoft Technology Like Asp.Net 2.0,Asp.Net 3.0,Asp.Net 4.0,
C#,MVC, Javascript, Crystal Reports, JQuery etc.

Find out more on :

Follow on   Twitter

Comments and Discussions

QuestionFontSize calculation PinmemberObiWan_MCC16-Feb-15 5:41 
QuestionCaptcha Image using C# in ASP.NET PinmemberMember 1035818912-Jan-15 0:39 
QuestionConverting this to MVC PinmemberAndrew Penny-SectionAfrican Thompson3-Dec-14 5:13 
QuestionGreat work PinmemberMoscowFlyer23-Sep-14 4:24 
GeneralVery nice article Pinmembernoreplay1024-Aug-14 23:53 
Questionconverted to vb Pinmembermiladsaa5-Aug-14 9:37 
QuestionImage Size PinmemberMember 1097263026-Jul-14 1:04 
Questioncaptcha image invalid PinmemberMember 93540234-Jul-14 19:47 
GeneralMy vote of 1 PinmemberAmmar Asjad Raja22-Apr-14 3:10 
Questionquestion PinmemberMember 998481212-Apr-14 22:09 
GeneralCaptcha PinmemberMember 1073607710-Apr-14 22:56 
GeneralERROR - Souce code PinmemberNatheem Safin5-Apr-14 21:36 
Questionrefresh Pinmemberpicee26-Jan-14 0:44 
GeneralPerfect Solution for Captch PinmemberSuman Zalodiya17-Dec-13 0:40 
Questioncaptcha image doesn't show up Pinmemberfniles1-Nov-13 4:46 
QuestionI made a video on CAPTCHA CONTROL in ASP.NET C# PinmemberAdhiraj Jaryal18-Oct-13 6:15 
SuggestionVery nice piece of code; applying a generic handler PinmemberMember 103106152-Oct-13 4:08 
Questionhow can i get refresh image PinmemberMember 1014512026-Jul-13 1:52 
QuestionRefresh Button PinmemberPediHero14-Jul-13 2:01 
QuestionChange the precision size PinmemberAlexandre Bencz17-Jun-13 6:15 
AnswerRe: Change the precision size PinmemberMember 101865912-Aug-13 22:38 
GeneralMy vote of 5 PinmemberOshtri Deka23-May-13 21:28 
QuestionCaptcha Generation PinmemberMember 983287831-Mar-13 1:06 
GeneralExcellent article PinmemberHarini kanipakam22-Mar-13 13:41 
GeneralMy vote of 5 Pinmember3mara12-Feb-13 1:35 
QuestionRegenerate Captha Pinmembergaga blues16-Sep-12 1:42 
GeneralMy vote of 5 Pinmembergaga blues16-Sep-12 1:03 
Questionjust roks Pinmemberomkarpardeshi12327-Aug-12 9:57 
Questiontnx Pinmemberjiji266315-Aug-12 16:15 
Questioncan see image local not deployed PinmemberMember 875979726-Jul-12 5:19 
Questiontank you Pinmembermaryam madadi28-Jun-12 5:59 
QuestionRefresh image Pinmembermoranmono10-Apr-12 0:27 
GeneralChange font color in the randomimage PinmemberEitan.Aviran26-Apr-11 23:01 
GeneralRe: Change font color in the randomimage PinmemberTarun Dudhatra27-Apr-11 8:56 
QuestionI am still unable to see an image Pinmembermlbrown23-Mar-11 7:30 
AnswerRe: I am still unable to see an image PinmemberTarun Dudhatra23-Mar-11 20:54 
GeneralOK let me try to insert code to download PinmemberTarun Dudhatra22-Mar-11 3:30 
Actually this entry is from my blog so there is no code, But let me try to provide code to download for full working example.
It will be available very soon.
QuestionCan you provide the Code or Project Download ? Pinmembermikelopilato22-Mar-11 2:27 
AnswerRe: Can you provide the Code or Project Download ? PinmemberTarun Dudhatra22-Mar-11 4:24 
QuestionHello Pinmemberaccount291221-Mar-11 22:20 
AnswerRe: Hello PinmemberTarun Dudhatra22-Mar-11 4:22 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web04 | 2.8.150327.1 | Last Updated 23 Mar 2011
Article Copyright 2011 by Tarun Dudhatra
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid