Podemos no ASP.NET 1.x criar e manipular imagens dinamicamente e assim exibir ao usuário. Utilizamos bastante isso em nosso dia à dia, quando precisamos recuperar um conteúdo (imagem) de uma base de dados, imagens do disco e até mesmo quando necessitamos criar uma imagem randômica, contendo letras e números para gerar Captchas. Infelizmente com a infraestrutura do ASP.NET 1.x, somente podemos definir no controle Image uma URL contendo o caminho até a imagem ou, se for uma imagem dinâmica, optar por uma das alternativas abaixo:
-
Criação de uma página ASPX: Esta opção consiste em criar uma página ASPX e, no evento Load desta, recuperamos os dados de uma base de dados, ou mesmo de um Stream e através da propriedade OutputStream da classe Response “escrevemos” a imagem na tela. Depois disso, definimos esta página criada na propriedade ImageUrl do controle Image. Apesar de satisfazer as necessidades, isso não é uma técnica muito interessante, pois temos toda a infraestrutura de uma página, que obrigatoriamente herdará da classe Page e, não necessitamos de tudo o que ela nos fornece para algo tão simples.
-
Implementação da Interface IHttpHandler: Através desta interface, podemos implementar o método ProcessRequest que, através do parâmetro do tipo HttpContext, temos todos os recursos disponíveis da requisição corrente. Neste método criamos ou recuperamos a imagem (se for uma base de dados) e da mesma forma que vimos anteriormente, utilizamos a propriedade OutputStream para “escrever” a imagem na tela. Feito isso, definimos esse Handler no arquivo Web.Config da aplicação para interceptar a requisição e, conseqüentemente, exibir a imagem. Este artigo exibe um exemplo de como fazer isso passo à passo.
Ambas as situações exigem do desenvolver uma grande atenção, pois primeiramente precisamos saber escolher a melhor forma de gerar isso. E como já disse anteriormente, há a limitação do controle Image somente aceitar arquivos em sua propriedade ImageUrl. Se tivermos um um Array de Bytes ou mesmo um objeto do tipo Bitmap com uma imagem, não temos alternativa de definí-los no controle Image a não ser criar uma página (ou Handler) para exibir essa imagem, pois não podemos atribuir esse Array ou Bitmap diretamente ao controle Image. Isso obriga o desenvolvedor escrever um código diferente para cada uma das ocasiões. Nesse momento conseguimos notar a deficiência deste controle.
Felizmente no ASP.NET 2.0 temos, ou melhor, tínhamos uma infraestrutra bem interessante para trabalharmos com imagens dinâmicas. Essa infraestrutura também nos fornece(ia) um controle para atender todas as necessidades, ou seja, a fonte da imagem pode ser um arquivo físico, do banco de dados ou até mesmo de um Array. Esse controle chama-se DynamicImage Control, que ao contrário do controle Image, que somente é um wrapper para a tag img do HTML, nos fornece uma série de propriedades e funcionalidades para atender todas as necessidades que o controle Image não atende. A Micrsoft decidiu retirar isso e, podemos confirmar isso neste link:
“Site counters, DynamicImage Control, and the Image Generation Service
After receiving feedback and conducting internal testing and evaluation, we have decided that these features require significant additions or changes in response to customer feedback, or significant additional testing to meet stability or scalability requirements. We have decided to remove these features for ASP.NET 2.0, and will look at adding them in a future version.”
Felizmente, Dino Esposito na coluna CuttingEdge da MSDN Magazine, escreveu em Abril de 2004 um artigo chamado Image Generation Service for ASP.NET 1.1. Não conheço os internals do controle DynamicImage, mas pelo que li a respeito dele, o controle/artigo do Dino substitui o mesmo, inclusive na versão 2.0 do ASP.NET. Acredito que, a única modificação seria utilizar o handler específico que temos no ASP.NET 2.0, os user defined handlers (WebHandlers).