Escrevendo Texto em Imagens

O .NET Framework fornece uma série de classes, que estão contidas dentro da DLL System.Drawing.dll (Namespace System.Drawing) para a manipulação de imagens. Utilizaremos algumas dessas classes para isso, mas antes de efetivamente entrarmos nesta análise, vamos entender a forma que vamos dispor isso ao usuário. Primeiramente vamos criar uma classe chamada GenerateDynamicImage que implmentará a interface IHttpHandler, e consequentemente vamos adicioná-la no arquivo Web.Config para que a mesma possa interpretar as requisições efetuadas à ela, que gerará a imagem do texto que vamos informar.

Abaixo é exibida o código da classe:

using System.Web;
using System.Drawing;
using System.Drawing.Text;
using System.Drawing.Imaging;

public class GenerateDynamicImage : IHttpHandler
{
     public void ProcessRequest(HttpContext context) 
     {
          //....
          string text = context.Request.QueryString["Text"];
          if(text != string.Empty){
               Bitmap bmp = null;
               Graphics graphic = null;
               try
               {
                    bmp = new Bitmap(200, 30);
                    graphic = Graphics.FromImage(bmp);
                    graphic.Clear(Color.LightBlue);
                    graphic.DrawString(text,
                         new Font("Verdana", 14, FontStyle.Bold),
                         Brushes.Black, 3, 3);

                    context.Response.ContentType = "image/GIF";
                    bmp.Save(context.Response.OutputStream, ImageFormat.Gif);
               }
               catch{}
               finally{
                    if(graphic != null) graphic.Dispose();
                    if(bmp != null) bmp.Dispose();
               }
          }
     }
}

Como podemos reparar, a classe implementa a interface IHttpHandler e através do método ProcessRequest recuperamos o string que será escrita através da QueryString (fornecida pelo HttpContext que é passado como parâmetro) e, através das classes Bitmap e Graphics configuramos a imagem, ajustando a cor, fonte, tamanho, etc., e mudamos o ContentType da requisição para que o ouput seja em formato de imagem. Finalmente, através da propriedade OutputStream, salvamos a imagem neste Stream que é enviado ao cliente.

Depois desta classe pronta, resta registrá-la no arquivo Web.Config da aplicação na seção de httpHandlers, como é mostrado abaixo:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
     <system.web> 
          <httpHandlers>
               <add 
                    verb="*" 
                    path="GenerateImage.ashx" 
                    type="WebApplication1.GenerateDynamicImage, WebApplication1"/>
          </httpHandlers>
     </system.web>
</configuration>

Finalmente para testarmos esse handler, criarmos uma página ASPX e colocamos nela um controle Label, TextBox, Button e um do tipo Image. No evento Click do Button adicionaremos o seguinte código:

this.Image1.ImageUrl = string.Concat("GenerateImage.ashx?Text=", this.TextBox1.Text.Trim());
Publicidade

Validação de QueryString

Pelo que noto em grande parte dos sites que visito é que poucos se preocupam em tratar a QueryString. Nem que ao menos crie uma página de erro customizada e a defina dentro do elemento customErrors no arquivo Web.Config da aplicação. E olha que nem as grandes corporações salvam: 🙂

[ Correto ]: http://ww16.itau.com.br/atendimento/faq/resp_topicos.aspx?assunto=5
[ Erro1 (string) ]: http://ww16.itau.com.br/atendimento/faq/resp_topicos.aspx?assunto=broken
[ Erro2 (overflow) ]: http://ww16.itau.com.br/atendimento/faq/resp_topicos.aspx?assunto=9999999999999