Search This Blog

Showing posts with label Login verification. Show all posts
Showing posts with label Login verification. Show all posts

Monday, May 31, 2010

How to do word image verification while submitting a form

These days word image verification has become very common. Mainly to avoid spam mail activities, automatic generation of accounts etc. Here's a simple method that generates an image using random alphabets.

First method recursively generates random characters, concatenates them into a string and returns it back.
public string CreateRandomCode(int codeCount)
{
string allChar = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
string[] allCharArray = allChar.Split(',');
string randomCode = "";
int temp = -1;

Random rand = new Random();

for (int i = 0; i < codeCount; i++)
{
if (temp != -1)
{
rand = new Random(i * temp * ((int)DateTime.Now.Ticks));
}

int t = rand.Next(36);

if (temp != -1 && temp == t)
{
return CreateRandomCode(codeCount);
}

temp = t;

randomCode += allCharArray[t];
}

return randomCode;
}
 
now the second method generates an image
using System.Drawing;


public void GenerateImage () {
string checkCode = this.CreateRandomCode(6);
Session["WordCheck"] = checkCode;

System.Drawing.Bitmap image = new System.Drawing.Bitmap(Convert.ToInt32(Math.Ceiling((decimal)(checkCode.Length * 14))), 22);

Graphics g = Graphics.FromImage(image);

try
{

Random random = new Random();
g.Clear(Color.AliceBlue);

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("Comic Sans MS", 12, System.Drawing.FontStyle.Bold);

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, new SolidBrush(Color.Red), 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();
}

}