Translate this page now :



»Programação
»Programação.NET
»Banco de Dados
»Webdesign
»Office
» Certificações Microsoft 4
»Treinamentos4
»Programação 4
»Webdesign«
»Office & User Tips«
»Grupos de Usuários
»Células Acadêmicas«

O melhor teclado da microsoft
Você já está cadastrado e participa do grupo de usuários de sua cidade ? Se não, comente o porque.
 
 
Faça um pequeno teste com 10 questões de VB
.:.
Teste seus conhecimentos em Visual Basic, SQL Server e ASP 3.0 com nossas provas on-line
.:.
Aprimore seus conhecimentos em programação com nosso treinamento on-line de lógica de programação
.:.
Veja nosso calendário de treinamentos
Gostou da Página?
Então

para um amigo!
 







Pesquisa personalizada
Pesquisar Dicas:

 







Criando Thumbnails para um diretório de imagens com ASP.NET

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.


Dennes Torres
MCSD,MCSE,MCDBA


� Búfalo Informática, Treinamento e Consultoria - Rua Álvaro Alvim, 37 Sala 920 - Cinelândia - Rio de Janeiro / RJ
Tel.: (21)2262-1368 (21) 9240-5134 (21) 9240-7281 e-Mail:
contato@bufaloinfo.com.br