Generar imagen Captcha con Generic Handler

by lukiller: 3. December 2009 09:40

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: 

Tags: , ,

ASP.Net

Comments are closed

about lukiller

Me la paso programando y aprendiendo nuevas tecnologías. En mi tiempo libre me dedico a trabajar...

RecentPosts

Powered by BlogEngine.NET 1.5.0.7 - Eco Theme by n3o Web Designers