<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>Creating CAPTCHA Image</Title>
      <Shortcut>CreatingCAPTCHAImage</Shortcut>
      <Description>Creating CAPTCHA Image [C#]</Description>
      <Author>Utkarsh Shigihalli</Author>
      <HelpUrl>/PreviewSnippet.aspx?SnippetID=bd93d6ce-dc77-4059-a790-df858a0752e6</HelpUrl>
      <SnippetTypes>
        <SnippetType>SurroundsWith</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Code Language="csharp"><![CDATA[// ====================================================================
// 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.LightGray,
    Color.DarkGray);
  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;
}

//Detail: http://www.brainjar.com/dotNet/CaptchaImage/]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>