Saturday 22 March 2014

generate captcha image in asp.net

Captcha Image is used to help to avoid the automatic code insertion by any software. There it generate the unique image with different type;
Just demonstrating the captcha  that you can create in ASP.net C# code;
Please see below for step by step procedure to get the captch image for C#

Step 1 :
@Code Add code to generate captcha Image
============================ Start ==================================================
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.Drawing.Text;
namespace Ramosh.Support.CaptchaImage
{


       /// Summary description for CaptchaImage.
       ///

       public class CaptchaImage
       {
              // Public properties (all read-only).
              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; }
              }
              // Internal properties.
              private string text;
              private int width;
              private int height;
              private string familyName;
              private Bitmap image;
              // For generating random numbers.
              private Random random = new Random();
              // ====================================================================
              // Initializes a new instance of the CaptchaImage class using the
              // specified text, width and height.
              // ====================================================================
              public CaptchaImage(string s, int width, int height)
              {
                     this.text = s;
                     this.SetDimensions(width, height);
                     this.GenerateImage();
              }
              // ====================================================================
              // Initializes a new instance of the CaptchaImage class using the
              // specified text, width, height and font family.
              // ====================================================================
              public CaptchaImage(string s, int width, int height, string familyName)
              {
                     this.text = s;
                     this.SetDimensions(width, height);
                     this.SetFamilyName(familyName);
                     this.GenerateImage();
              }
              // ====================================================================
              // This member overrides Object.Finalize.
              // ====================================================================
              ~CaptchaImage()
              {
                     Dispose(false);
              }
              // ====================================================================
              // Releases all resources used by this object.
              // ====================================================================
              public void Dispose()
              {
                     GC.SuppressFinalize(this);
                     this.Dispose(true);
              }
              // ====================================================================
              // Custom Dispose method to clean up unmanaged resources.
              // ====================================================================
              protected virtual void Dispose(bool disposing)
              {
                     if (disposing)
                           // Dispose of the bitmap.
                           this.image.Dispose();
              }
              // ====================================================================
              // Sets the image width and height.
              // ====================================================================
              private void SetDimensions(int width, int height)
              {
                     // Check the width and 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;
              }
              // ====================================================================
              // Sets the font used for the image text.
              // ====================================================================
              private void SetFamilyName(string familyName)
              {
                     // If the named font is not installed, default to a system font.
                     try
                     {
                           Font font = new Font(this.familyName, 12F);
                           this.familyName = familyName;
                           font.Dispose();
                     }
                     catch (Exception ex)
                     {
                           this.familyName = System.Drawing.FontFamily.GenericSerif.Name;
                     }
              }
              // ====================================================================
              // Creates the bitmap image.
              // ====================================================================
              private void GenerateImage()
              {
                     // Create a new 32-bit bitmap image.
                     Bitmap bitmap = new Bitmap(this.width, this.height, PixelFormat.Format32bppArgb);
                     // Create a graphics object for drawing.
                     Graphics g = Graphics.FromImage(bitmap);
                     g.SmoothingMode = SmoothingMode.AntiAlias;
                     Rectangle rect = new Rectangle(0, 0, this.width, this.height);
                     // Fill in the background.
                     HatchBrush hatchBrush = new HatchBrush(HatchStyle.SmallConfetti, Color.LightGray, Color.White);
                     g.FillRectangle(hatchBrush, rect);
                     // Set up the text font.
                     SizeF size;
                     float fontSize = rect.Height + 1;
                     Font font;
                     // Adjust the font size until the text fits within the image.
                     do
                     {
                           fontSize--;
                           font = new Font(this.familyName, fontSize, FontStyle.Bold);
                           size = g.MeasureString(this.text, font);
                     } while (size.Width > rect.Width);
                     // Set up the text format.
                     StringFormat format = new StringFormat();
                     format.Alignment = StringAlignment.Center;
                     format.LineAlignment = StringAlignment.Center;
                     // Create a path using the text and warp it randomly.
                     GraphicsPath path = new GraphicsPath();
                     path.AddString(this.text, font.FontFamily, (int) font.Style, font.Size, 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);
                     // Draw the text.
                     hatchBrush = new HatchBrush(HatchStyle.LargeConfetti, Color.Black , Color.Black );
                     g.FillPath(hatchBrush, path);
                     // Add some random noise.
                     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);
                     }
                     // Clean up.
                     font.Dispose();
                     hatchBrush.Dispose();
                     g.Dispose();
                     // Set the image.
                     this.image = bitmap;
              }
       }
}
===========================End code for creating  Image ==========================
Step 2:
@Code in CaptchaJPEG.aspx
============ Code where to call the Image creating ===========================
HTML Code
<body>
              <form id="JpegImage" method="post" runat="server">
              </form>
       </body>
C# Code
protected void Page_Load(object sender, EventArgs e)
    {
        // Create a CAPTCHA image using the text stored in the Session object.
        Ramosh.Support.CaptchaImage.CaptchaImage ci = new Ramosh.Support.CaptchaImage.CaptchaImage(this.Session["CaptchaImageText"].ToString(), 200, 50, "Century Schoolbook");
        // Change the response headers to output a JPEG image.
        this.Response.Clear();
        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.
        ci.Dispose();
    }
================== End to call Code Image ====================
Step 3:
@How to call and Used it in aspx
Putting below code in aspx page where <img src="CaptchaJPEG.aspx" alt="image" /> is used to create the captcha image and along with this maintain it into session.
<tr>
                                    <td align="left" width="50px">
                                        <b>Enter code ::</b>
                                    </td>
                                    <td align="left" width="350px">
                                        <img src="CaptchaJPEG.aspx" alt="image" /><br />
                                        <asp:TextBox ID="txtCaptchaCode" MaxLength="15" runat="server"></asp:TextBox>
                                        <asp:CustomValidator ID="cvPearlCaptha" SetFocusOnError="true" runat="server" ValidationGroup="A2"
                                            Display="Dynamic" ErrorMessage="Please Enter the correct Code!!" OnServerValidate="cvCaptha_ServerValidate"></asp:CustomValidator>
                                    </td></tr>
C# code
a.        Calling method and bind it to session
this.Session["CaptchaImageText"] = GenerateRandomCode();
b.  Returning six digit number;
//
        // Returns a string of six random digits.
        //
        protected string GenerateRandomCode()
        {
            string s = string.Empty;
            for (int i = 0; i < 6; i++)
                s = String.Concat(s, this.random.Next(10).ToString());
            return s;
        }
c.  Custom validation code to generate the new code or to check the validation.
protected void cvCaptha_ServerValidate(object source, ServerValidateEventArgs args)
    {
        if (this.Session["CaptchaImageText"] != null && this.txtCaptchaCode.Text != this.Session["CaptchaImageText"].ToString())
        {
            this.txtCaptchaCode.Text = string.Empty;
            this.Session["CaptchaImageText"] = GenerateRandomCode();
            args.IsValid = false;
            upreview.Update();
            return;
        }
        else
        {
            args.IsValid = true;
            return;
        }
    }
d.  On click the button it will first check the validation.
this.Session["CaptchaImageText"] = GenerateRandomCode();
        if (Page.IsValid)
        {
@OutPut How captcha image will display

No comments:

Post a Comment