El siguiente código sirve para generar una imagen Captcha desde un Generic Handler. Es bastante sencillo, se crea un objeto Bitmap y se escribe un texto en el y se envìa hacia el browser mediante Response. También le agregué unos círculos de fondo a modo de ejemplo para engañar a los reconocedores automáticos de captchas. Así como los círculos se pueden agregar cualquier tipo de dibujos o imagenes. La forma de invocar al captcha es desde un objeto IMG de HTML.
using System.Web;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.IO;
namespace Captcha
{
public class GetCaptcha : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
MemoryStream mem = new System.IO.MemoryStream();
Bitmap bmp = CrearCaptcha("8765ABC1", 80, 25); //Generar el código aleatoriamente.
bmp.Save(mem, System.Drawing.Imaging.ImageFormat.Jpeg);
context.Response.ContentType = "image/jpeg";
mem.WriteTo(context.Response.OutputStream);
bmp.Dispose();
}
private Bitmap CrearCaptcha(string code, int ancho, int altura)
{
Bitmap bmp = new Bitmap(ancho, altura);
Graphics g = Graphics.FromImage(bmp);
g.SmoothingMode = SmoothingMode.AntiAlias;
SolidBrush relleno = new SolidBrush(Color.DeepSkyBlue);
g.FillRectangle(relleno, 0, 0, ancho, altura);
Pen pen = new Pen(Color.Yellow, 2);
g.DrawArc(pen, 10, 5, 20, 10, 0, 360);
g.DrawArc(pen, 40, 10, 20, 10, 0, 360);
relleno = new SolidBrush(Color.Navy);
fuente = new span("arial", 11, spanStyle.Bold, GraphicsUnit.Point);
g.DrawString(code, fuente, relleno, 2, 2);
return bmp;
}
public bool IsReusable
{
get
{
return false;
}
}
}
}
Invocación desde el archivo ASPX:
<img src="GetCaptcha.ashx" alt="Captcha code" />
Pueden mejorarlo utilizando otros tipos de fuentes, también obteniendo los códigos desde un diccionario prearmado y/o cambiando los colores a gusto. Así queda mostrado en un browser:
