none
Visualizador de Fotos no vb.net

    Question

  • Olá,

    Estou precisando fazer um visualizador de fotos em vb.net pro meu sistema.

    Seria da mesma forma que faço em php pros site que da seguinte forma:

    Em uma pasta coloco todas as fotos do cliente, no banco de dados só informo o nome da pasta o sistema vai e lista todas as fotos que estão dentro da pasta.

    Mostrando elas peguenas e quando clicando mostra ao lado a foto do tamanho real.

    Só que não estou conseguindo fazer isso vb.net (lembrando que é win form - desktop).

     

    Alguém sabe onde eu encontro um exemplo de visualizador de fotos?

     

    Obrigado

     

     

    Sunday, February 04, 2007 8:30 PM

Answers

  • Não é difícil. Veja um exemplo no form abaixo. Inclua num projeto, passe o caminho para a pasta com fotos ao objeto DirectoryInfo (no evento Load do form), inclua alguma extensão a mais, se necessário, e instancie:

    Option Strict On
    Option Explicit On

    Imports System
    Imports System.IO
    Imports System.Collections
    Imports System.Drawing
    Imports System.Windows.Forms

    Public Class FrmImages
        Inherits System.Windows.Forms.Form

        Private list As ArrayList

        Private Panel1 As New Panel
        Private Panel2 As New Panel
        Private PictureBox1 As New PictureBox
        Public Sub New()
            Panel1.Anchor = CType(((AnchorStyles.Top Or AnchorStyles.Bottom) _
                        Or AnchorStyles.Left), AnchorStyles)
            Panel1.Location = New Point(12, 12)
            Panel1.Size = New Size(168, 250)
            Panel1.AutoScroll = True

            Me.Panel2.Anchor = CType((((AnchorStyles.Top Or AnchorStyles.Bottom) _
                Or AnchorStyles.Left) _
                Or AnchorStyles.Right), AnchorStyles)
            Me.Panel2.Controls.Add(PictureBox1)
            Me.Panel2.Location = New Point(186, 12)
            Me.Panel2.Size = New Size(100, 250)
            Panel2.AutoScroll = True


            PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
            Panel2.Controls.Add(PictureBox1)

            Me.Controls.Add(Me.Panel1)
            Me.Controls.Add(Me.Panel2)
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            list = New ArrayList
            Dim dir As New DirectoryInfo(<caminho>)
            ' Extensões a serem selecionadas.
            Dim extensoes As String() = New String() {"*.jpeg", "*.jpg", "*.bmp"}
            ' Coloca todas as imagens do diretório no ArrayList
            For Each extensao As String In extensoes
                Dim arquivos As FileInfo() = dir.GetFiles(extensao)
                For Each arquivo As FileInfo In arquivos
                    list.Add(arquivo.FullName)
                Next
            Next

            ' Inclui thumbnails no painel
            For i As Integer = 0 To list.Count - 1
                Dim pic As New PictureBox()
                pic.Location = New Point(10, i * 105)
                pic.Size = New Size(134, 100)
                pic.Image = Thumbnail(list.Item(i).ToString())
                pic.Name = i.ToString()
                ' Adiciona evento click para o novo PictureBox
                AddHandler pic.Click, AddressOf Me.PictureBoxes_Click

                Panel1.Controls.Add(pic)
            Next
            Me.WindowState = FormWindowState.Maximized
        End Sub

        ' Gera um thumbnail
        Private Function Thumbnail(ByVal caminho As String) As Bitmap
            Dim original As Bitmap = DirectCast(Image.FromFile(caminho), Bitmap)
            Dim modificada As Bitmap = New Bitmap(134, 100)
            modificada = DirectCast(original.GetThumbnailImage(modificada.Width, modificada.Height, Nothing, IntPtr.Zero), Bitmap)
            Return modificada
        End Function

        ' Evento Click dos thumbnails
        Private Sub PictureBoxes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Dim pic As PictureBox = DirectCast(sender, PictureBox)

            Dim indice As Int32 = Convert.ToInt32(pic.Name)
            Call ExibeImagem(indice)
        End Sub

        ' Exibe imagem em tamanho natural
        Private Sub ExibeImagem(ByVal indice As Integer)
            PictureBox1.Load(list.Item(indice).ToString())
        End Sub
    End Class

    Sunday, February 04, 2007 10:48 PM
  • O compilador está dizendo que tem outro PictureBox PictureBox1 declarado.

    O exemplo está pronto, você não precisa adicionar controle nenhum. Abra um projeto WinForms, adicione uma classe e substitua o código gerado por padrão pelo código do exemplo. Depois no form gerado por padrão no projeto instancie o form do exempo:

    Dim f As New FrmImages
    f.Show()

     

    Monday, February 05, 2007 10:44 AM
  •  Alex Passos wrote:

    Se eu retirar esse parte do código e colocar os controles dentro form vai funcionar normalmente?

    Aparecendo a barra de rolagem quando tiver muitas fotos e ao clicar vai aparecer do lado.

    obrigado

    Vai, desde que vc deixe os espaços para que as barras apareçam e configure os paineis para que tenham barras.

    Se vc não quiser modificar mais o código, apenas vá nas propriedades do projeto (dê um duplo clique na pasta "My Project" no Solution Explorer), aba Application e ponha o frmImages como o form inicial no Combo com o texto "Startup form" e pode deletar o outro.

    Se quiser refazer o form, siga os passos:

    1) Adicione um panel para os thumbnails e ajuste as propriedades Anchor, Size e Location, AutoScroll para os mesmos valores do exemplo (veja os valores na criação dos objetos no construtor do exemplo).

    2) Adicione um segundo panel em que ficará o PictureBox  que exibirá a imagem em tamanho real. Copie os valores das propriedades do construtor do exemplo, como no primeiro panel etc.

    3) Adicione um PictureBox dentro do segundo Panel e ajuste a propriedade SizeMode para PictureBoxSizeMode.AutoSize, como no construtor do exemplo.

    4) Copie todo o código do exemplo, exceto o construtor.

     

    Monday, February 05, 2007 7:25 PM
  • Tem, basta você fazer as contas e posicionar os thumbnails de acordo. Supondo que você queira colocar 10 thumbnail por coluna, por exemplo, use o código abaixo no lugar do original que está no seu método Form_Load() (não retire do método o código que preenche o ArrayList com o caminho das imagens, substitua apenas o código que posiciona os thumbnails, que está marcado com o comentário " Inclui thumbnails no painel".):

            ' Posição X inicial
            Dim posX As Integer = 5
            Dim posY As Integer = 0
            ' Inclui thumbnails no painel
            For i As Integer = 0 To list.Count - 1
                If i <> 0 AndAlso i Mod 10 = 0 Then
                    ' Incrementa posição X pela largura do thumbnail (134) e alguns
                    ' pixels extras para espacamento entre eles.
                    posX += 140
                    ' Reseta posição Y para começão a nova coluna de thumbnails
                    posY = 0
                End If

                Dim pic As New PictureBox()
                pic.Location = New Point(posX, posY * 105)
                pic.Size = New Size(134, 100)
                pic.Image = Thumbnail(list.Item(i).ToString())
                pic.Name = i.ToString()
                ' Adiciona evento click para o novo PictureBox
                AddHandler pic.Click, AddressOf Me.PictureBoxes_Click

                Panel1.Controls.Add(pic)
                ' Incrementa contador para posicionamento vertical dos thumbnails
                posY += 1
            Next
            ' Adiona o equivalente a mais um thumbnail e um pequeno
            ' espaço para a barra de rolagem
            posX += 150
            ' Tamanho do panel1
            Panel1.Size = New Size(posX, Panel1.Size.Height)
            ' Localização do panel2
            Panel2.Location = New Point(posX, Panel2.Location.Y)

    Se vc quiser colocar um número diferente de 10 thumbnails por coluna, mude o divisor do módulo, ou se vc quiser dividir por um número específico de colunas, faça as contas para saber quantos thumbnails devem ficar em cada coluna etc.

    Tuesday, February 06, 2007 12:48 AM

All replies

  • Não é difícil. Veja um exemplo no form abaixo. Inclua num projeto, passe o caminho para a pasta com fotos ao objeto DirectoryInfo (no evento Load do form), inclua alguma extensão a mais, se necessário, e instancie:

    Option Strict On
    Option Explicit On

    Imports System
    Imports System.IO
    Imports System.Collections
    Imports System.Drawing
    Imports System.Windows.Forms

    Public Class FrmImages
        Inherits System.Windows.Forms.Form

        Private list As ArrayList

        Private Panel1 As New Panel
        Private Panel2 As New Panel
        Private PictureBox1 As New PictureBox
        Public Sub New()
            Panel1.Anchor = CType(((AnchorStyles.Top Or AnchorStyles.Bottom) _
                        Or AnchorStyles.Left), AnchorStyles)
            Panel1.Location = New Point(12, 12)
            Panel1.Size = New Size(168, 250)
            Panel1.AutoScroll = True

            Me.Panel2.Anchor = CType((((AnchorStyles.Top Or AnchorStyles.Bottom) _
                Or AnchorStyles.Left) _
                Or AnchorStyles.Right), AnchorStyles)
            Me.Panel2.Controls.Add(PictureBox1)
            Me.Panel2.Location = New Point(186, 12)
            Me.Panel2.Size = New Size(100, 250)
            Panel2.AutoScroll = True


            PictureBox1.SizeMode = PictureBoxSizeMode.AutoSize
            Panel2.Controls.Add(PictureBox1)

            Me.Controls.Add(Me.Panel1)
            Me.Controls.Add(Me.Panel2)
        End Sub

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            list = New ArrayList
            Dim dir As New DirectoryInfo(<caminho>)
            ' Extensões a serem selecionadas.
            Dim extensoes As String() = New String() {"*.jpeg", "*.jpg", "*.bmp"}
            ' Coloca todas as imagens do diretório no ArrayList
            For Each extensao As String In extensoes
                Dim arquivos As FileInfo() = dir.GetFiles(extensao)
                For Each arquivo As FileInfo In arquivos
                    list.Add(arquivo.FullName)
                Next
            Next

            ' Inclui thumbnails no painel
            For i As Integer = 0 To list.Count - 1
                Dim pic As New PictureBox()
                pic.Location = New Point(10, i * 105)
                pic.Size = New Size(134, 100)
                pic.Image = Thumbnail(list.Item(i).ToString())
                pic.Name = i.ToString()
                ' Adiciona evento click para o novo PictureBox
                AddHandler pic.Click, AddressOf Me.PictureBoxes_Click

                Panel1.Controls.Add(pic)
            Next
            Me.WindowState = FormWindowState.Maximized
        End Sub

        ' Gera um thumbnail
        Private Function Thumbnail(ByVal caminho As String) As Bitmap
            Dim original As Bitmap = DirectCast(Image.FromFile(caminho), Bitmap)
            Dim modificada As Bitmap = New Bitmap(134, 100)
            modificada = DirectCast(original.GetThumbnailImage(modificada.Width, modificada.Height, Nothing, IntPtr.Zero), Bitmap)
            Return modificada
        End Function

        ' Evento Click dos thumbnails
        Private Sub PictureBoxes_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            Dim pic As PictureBox = DirectCast(sender, PictureBox)

            Dim indice As Int32 = Convert.ToInt32(pic.Name)
            Call ExibeImagem(indice)
        End Sub

        ' Exibe imagem em tamanho natural
        Private Sub ExibeImagem(ByVal indice As Integer)
            PictureBox1.Load(list.Item(indice).ToString())
        End Sub
    End Class

    Sunday, February 04, 2007 10:48 PM
  • Olá

    acho que fiz tudo certo....

    eu abri um novo projeto no form adicionei um PictureBox1 no form depois retirei e continua dando o erro nesta linha

    Private PictureBox1 As New PictureBox

    'PictureBox1' is already declared as 'Friend Dim WithEvents PictureBox1 as System.Windows.Forms.PictureBox' in this class

    tentei colocar do jeito que esta falando mais não funcionou

    O que tenho que fazer agora?

     

    Obrigado

     

    Monday, February 05, 2007 3:12 AM
  • O compilador está dizendo que tem outro PictureBox PictureBox1 declarado.

    O exemplo está pronto, você não precisa adicionar controle nenhum. Abra um projeto WinForms, adicione uma classe e substitua o código gerado por padrão pelo código do exemplo. Depois no form gerado por padrão no projeto instancie o form do exempo:

    Dim f As New FrmImages
    f.Show()

     

    Monday, February 05, 2007 10:44 AM
  • Angus MacGyver,

    muito obrigado funcionou 100%...

    Depois eu adicionei o código no form normal que abre com o novo projeto... funcionou do mesmo jeito.

    Mais quando tentei mudar a cor do form não funcionou ele continuou no mesmo modelo... tentei colocar o layout do form no padrão do meu sistema e não esta aceitando.

    Porque?

    obrigado

    Monday, February 05, 2007 12:53 PM
  • Porque eu monto o form no exemplo direto no construtor (sub New()). Ou você retira o construtor do exemplo e recoloca os controles no form deixando que o VS controle (de preferência), ou você inclui uma chamada para o método InitializeComponent()
    no construtor.
    Monday, February 05, 2007 1:18 PM
  • Se eu retirar esse parte do código e colocar os controles dentro form vai funcionar normalmente?

    Aparecendo a barra de rolagem quando tiver muitas fotos e ao clicar vai aparecer do lado.

    obrigado

    Monday, February 05, 2007 5:23 PM
  •  Alex Passos wrote:

    Se eu retirar esse parte do código e colocar os controles dentro form vai funcionar normalmente?

    Aparecendo a barra de rolagem quando tiver muitas fotos e ao clicar vai aparecer do lado.

    obrigado

    Vai, desde que vc deixe os espaços para que as barras apareçam e configure os paineis para que tenham barras.

    Se vc não quiser modificar mais o código, apenas vá nas propriedades do projeto (dê um duplo clique na pasta "My Project" no Solution Explorer), aba Application e ponha o frmImages como o form inicial no Combo com o texto "Startup form" e pode deletar o outro.

    Se quiser refazer o form, siga os passos:

    1) Adicione um panel para os thumbnails e ajuste as propriedades Anchor, Size e Location, AutoScroll para os mesmos valores do exemplo (veja os valores na criação dos objetos no construtor do exemplo).

    2) Adicione um segundo panel em que ficará o PictureBox  que exibirá a imagem em tamanho real. Copie os valores das propriedades do construtor do exemplo, como no primeiro panel etc.

    3) Adicione um PictureBox dentro do segundo Panel e ajuste a propriedade SizeMode para PictureBoxSizeMode.AutoSize, como no construtor do exemplo.

    4) Copie todo o código do exemplo, exceto o construtor.

     

    Monday, February 05, 2007 7:25 PM
  • Mais uma ves muito obrigado

    Eu adicionei os controle no form e funcionou... agora posso mudar o layout do form.

     

    valeu

    Monday, February 05, 2007 9:32 PM
  • Deixa eu pertubar mais um pouquinho

    tem como colocar em mais de uma coluna?

    No caso ele só esta com uma coluna, tem como colocar pra listar em 2 ou 4 colunas

     

    valeu

    Monday, February 05, 2007 10:34 PM
  • Tem, basta você fazer as contas e posicionar os thumbnails de acordo. Supondo que você queira colocar 10 thumbnail por coluna, por exemplo, use o código abaixo no lugar do original que está no seu método Form_Load() (não retire do método o código que preenche o ArrayList com o caminho das imagens, substitua apenas o código que posiciona os thumbnails, que está marcado com o comentário " Inclui thumbnails no painel".):

            ' Posição X inicial
            Dim posX As Integer = 5
            Dim posY As Integer = 0
            ' Inclui thumbnails no painel
            For i As Integer = 0 To list.Count - 1
                If i <> 0 AndAlso i Mod 10 = 0 Then
                    ' Incrementa posição X pela largura do thumbnail (134) e alguns
                    ' pixels extras para espacamento entre eles.
                    posX += 140
                    ' Reseta posição Y para começão a nova coluna de thumbnails
                    posY = 0
                End If

                Dim pic As New PictureBox()
                pic.Location = New Point(posX, posY * 105)
                pic.Size = New Size(134, 100)
                pic.Image = Thumbnail(list.Item(i).ToString())
                pic.Name = i.ToString()
                ' Adiciona evento click para o novo PictureBox
                AddHandler pic.Click, AddressOf Me.PictureBoxes_Click

                Panel1.Controls.Add(pic)
                ' Incrementa contador para posicionamento vertical dos thumbnails
                posY += 1
            Next
            ' Adiona o equivalente a mais um thumbnail e um pequeno
            ' espaço para a barra de rolagem
            posX += 150
            ' Tamanho do panel1
            Panel1.Size = New Size(posX, Panel1.Size.Height)
            ' Localização do panel2
            Panel2.Location = New Point(posX, Panel2.Location.Y)

    Se vc quiser colocar um número diferente de 10 thumbnails por coluna, mude o divisor do módulo, ou se vc quiser dividir por um número específico de colunas, faça as contas para saber quantos thumbnails devem ficar em cada coluna etc.

    Tuesday, February 06, 2007 12:48 AM
  • muito obrigado

    funcionou 100%

    Tuesday, February 06, 2007 1:21 AM
  • Por favor, Vc ou alguém saberia me mostrar um visualizador desses de imagem em Web? e se tem algum exemplo web ou form mesmo que rotacionasse as imagens, desse zoom, e outros...

    Obrigado
    Tuesday, July 07, 2009 12:12 PM