

| com exemplos em VB |
| Componente para deixar forms em Vb semelhantes às telas do winnamp |
| Componente para colocar sua aplicação VB no Systray |
| Componente para transformar sua aplicação VB em serviço |
| Ferramentas úteis para quem usa Olap Server |
| |

![]() |
||||||||
|
|
||||||||
Em nosso artigo anterior, onde mostramos como criar gráficos a partir de dados do banco, começamos a mostrar os recursos que o ASP.NET possui para manipular imagens.
Vamos utilizar outro exemplo para continuarmos demonstrando os recursos de
tratamento de imagens no ASP.NET e vamos aproveitar agora para demonstrar
também os recursos de acesso a arquivos.
Nosso objetivo é gerar uma pagina que exiba thumbnails das imagens contidas em um diretório, com links para a imagem em si. Para complicar um pouco mais vamos escolher um diretório que não esteja compartilhado via IIS, portanto não podemos utilizar um link direto para as imagens.
Podemos iniciar o trabalho com um webform vazio, trabalharemos basicamente no código do formulário.
Para podermos manipular o sistema de arquivos vamos começar fazendo um Imports do namespace System.IO .
Vamos trabalhar basicamente com dois objetos : DirectoryInfo, que nos permite pegar as informações a respeito de uma determinada pasta e FileSystemInfo, que nos permite pegar as informações sobre um objeto que esteja dentro da pasta. Precisaremos também de um vetor de filesysteminfos, para recebermos o resultado devolvido pelo objeto directoryinfo.
Veja as declarações das variáveis no Page_Load :
Dim di As New DirectoryInfo("C:\documents and settings\administrator\my documents\my pictures")
Dim fi As FileSystemInfo
Dim fia As FileSystemInfo()
Observem que já inicializei o objeto directoryInfo passando para seu
constructor um caminho de diretório onde sei que existem muitas imagens.
No teste de vocês alterem esse caminho adequadamente.
Um recurso interessante que utilizaremos será a criação dinâmica de WebControls. Sim, isso mesmo, podemos criar instâncias de WebControls dinamicamente via código e vamos fazer isso para criar novos objetos image. Assim precisaremos de uma variável adicional para o objeto image que criaremos, veja :
Dim img As System.Web.UI.WebControls.Image
O próximo passo é obtermos um vetor de filesystemInfos a partir de nossa variável DI já instanciada, veja :
fia = di.GetFileSystemInfos("*.jpg")
Observem que fiz um filtro para obter apenas os arquivos de imagem, arquivos com extensão .JPG
Agora precisamos vasculhar o vetor contido em fia e para cada elemento do vetor criar um objeto IMAGE que permita exibi-lo. Precisaremos também, claro, adicionar o objeto IMAGE na coleção de controles contidos na página. Veja como fica o código :
For Each fi In fia
img = New System.Web.UI.WebControls.Image()
img.ImageUrl = fi.FullName
Page.Controls.Add(img)
Next
Utilizando um for Each e nossa variável fi vasculhamos o vetor FIA, gerando para cada arquivo um novo objeto IMAGE. Configuramos a URL da imagem e enfim adicionamos a imagem na página com a linha page.controls.add(img).
Veja como ficou o código completo do page_load :
Dim di As New DirectoryInfo("C:\documents and settings\administrator\my documents\my pictures")
Dim fi As FileSystemInfo
Dim fia As FileSystemInfo()
Dim img As System.Web.UI.WebControls.Image
fia = di.GetFileSystemInfos("*.jpg")
For Each fi In fia
img = New System.Web.UI.WebControls.Image()
img.ImageUrl = fi.FullName
Page.Controls.Add(img)
Next
O resultado funciona maravilhosamente bem localmente, mas é claro que
irá falhar se acessado de forma remota, pois a URL utilizada para a
imagem é um caminho local (C:\...) .
Para resolvermos esse problema precisaremos de uma pagina que recupere a imagem do disco local e a exiba na página. Veja como fica o código desta página, os comentários o tornam praticamente auto-explicativo :
<%@ Page Language="vb" Debug="true" %>
<%
' Inicializa as variáveis
Dim strFilename as string
Dim g as System.Drawing.Image
' Obtem o nome do arquivo, que foi passador por parâmetro
strFilename = request.querystring("img")
' Gera uma nova imagem a partir do arquivo
g = System.Drawing.Image.FromFile(strFilename)
' Altera o contentType : Esta página devolve uma imagem
response.contenttype="image/jpeg"
' Insere a imagem no objeto response
g.save(response.outputstream, g.rawformat)
' destroi o objeto imagem na memória do servidor
g.dispose()
%>
Precisamos alterar então a linha que gera a URL da imagem, para que chame este arquivo, ao qual daremos o nome de exibeImagem.aspx. Veja como fica a linha alterada:
img.ImageUrl = "exibeimagem.aspx?img=" & fi.FullName
Agora nossa página já pode ser acessada remotamente, o que é
ótimo, mas ainda não atingimos nosso objetivo de gerar thumbnails
das imagens. Para podermos fazer isso teremos que fazer uma pequena alteração
no método save.
O objeto IMAGE possui um método chamado GETTHUMBNAILIMAGE. Os dois primeiros parâmetros deste método determinam o tamanho do thumbnail, enquanto que os 2 últimos não são utilizados, mas precisam ser passados por formalidade. O método GetThumnailImage gera um objeto IMAGE como resultado, então podemos utilizar o método SAVE deste objeto IMAGE resultante para imprimi-lo na página. Veja como fica :
<%@ Page Language="vb" Debug="true" %>
<%
' Inicializa as variáveis
Dim strFilename as string
Dim g as System.Drawing.Image
dim cb as System.Drawing.Image.GetThumbnailImageAbort
dim cbd as System.IntPtr
' Obtem o nome do arquivo, que foi passador por parâmetro
strFilename = request.querystring("img")
' Gera uma nova imagem a partir do arquivo
g = System.Drawing.Image.FromFile(strFilename)
' Altera o contentType : Esta página devolve uma imagem
response.contenttype="image/jpeg"
' Insere a imagem no objeto response
g.getthumbnailimage(50,50,cb, cbd).save(response.outputstream, g.rawformat)
' destroi o objeto imagem na memória do servidor
g.dispose()
%>
Observe que as variáveis CB e CBD nem ao menos estão instanciadas,
são passadas por mera formalidade. Não vou, porém, alterar
o código da página "ExibeImagem.aspx", porque, na
verdade, ainda precisaremos dela. Vamos, sim, criar uma nova página
com esse código novo, vamos chamar de thumbs.aspx, e alterar a linha
de chamada, veja :
img.ImageUrl = "exibeimagem.aspx?img=" & fi.FullName
Ao rodar a aplicação você verá não mais as imagens, mas sim thumbnails delas, gerados pelo ASP.NET com o uso de um simples método.
Gerar os thumbnails é interessante, mas melhor que isso é podermos criar em cada thumbnail um link para a imagem em tamanho original. Mais uma vez teremos que criar um objeto dinamicamente, um HyperLink (System.Web.UI.WebControls.HyperLink).
A cada item processado em nosso for/each precisaremos criar um novo Hyperlink. A propriedade navigateURL apontará para a página ExibeImagem.aspx, de forma a exibirmos a imagem em seu tamanho original. Precisaremos também definir o conteúdo do Hyperlink, isso pode parecer um pouco mais complexo : Não vamos definir isso na propriedade TEXT, mas sim na propriedade CONTROLS. A propriedade CONTROLS define controles filho, ou seja, contidos no objeto hyperlink. Em nosso caso transformaremos nosso controle image em um controle filho do hyperlink e por sua vez incluiremos o hyperlink na coleção controls da pagina (page). Complicado ? Nem tanto, veja como fica o código :
Dim di As New DirectoryInfo("C:\documents and settings\administrator\my documents\my pictures")
Dim fi As FileSystemInfo
Dim fia As FileSystemInfo()
Dim img As System.Web.UI.WebControls.Image
Dim lnk As System.Web.UI.WebControls.HyperLink
fia = di.GetFileSystemInfos("*.jpg")
For Each fi In fia
lnk = New HyperLink()
lnk.NavigateUrl = "exibeimagem.aspx?img=" & fi.FullName
img = New System.Web.UI.WebControls.Image()
img.ImageUrl = "thumbs.aspx?img=" & fi.FullName
lnk.Controls.Add(img)
Page.Controls.Add(lnk)
Next
Utilizando esta combinação de 3 páginas - a principal,
a de exibição de uma imagem, exibeimagem.aspx e a de geração
de thumbnails, thumbs.aspx - conseguimos gerar thumbnails para as imagens
contidas em um diretório e links para a imagem em tamanho original,
mostrando mais uma vez o poder da manipulação de imagens disponível
no framework.net.
© Búfalo Informática,
Treinamento e Consultoria -
Rua Álvaro Alvim, 37 Sala 920 • Cinelândia • Rio de Janeiro • RJ
Tel.: (21)2262-1368 • e-Mail: contato@bufaloinfo.com.br