none
como sobrepor uma imagem RRS feed

  • Pergunta

  • bom dia estou com uma aplicação com um cadastro de pacientes que salva a foto dele.

    Nesse campo foto eu salvo copio a foto e salvo ela numa outra pasta. a foto fica com o seguinte texto (paciente_1.jpg)

    quando o usuario tenta alterar a foto eu nao consigo fazer com que a aplicação sobreponha a imagem igual a mensagem do windows (voce ja possui uma foto com esse nome deseja alterá-la?)e se sim alterar a imagem

    alguem sabe como eu posso fazer isso

    terça-feira, 29 de junho de 2010 11:50

Respostas

  • Rodrigo,

    Basta voce salvar a imagem do picturebox em um arquivo temp e depois ler os bytes do arquivo como você fazia:

        Dim bmp As New Bitmap(PictureBox1.Image)
        bmp.Save("C:\imgTEMP.temp")
        bmp.Dispose()
        Dim fs As New IO.FileStream("C:\imgTEMP.temp", IO.FileMode.Open, IO.FileAccess.Read)
    
        ' Cria um array de Bytes do tamanho do FileStream 
        Dim ImageData(fs.Length() - 1) As Byte
        'If caminho_foto <> "" Then
        ' Lê os bytes do FileStream para o array criado
        fs.Read(ImageData, 0, ImageData.Length)
    
        ' Fecha o FileStream ficando a imagem guardada no array
        fs.Close()
        'End If
        IO.File.Delete("C:\imgTEMP.temp")
    • Marcado como Resposta Rodrigo.O quarta-feira, 7 de julho de 2010 14:12
    quarta-feira, 7 de julho de 2010 10:39
  • Rodrigo Criei duas funções. Uma pra carregar a imagem corretamente e outra para sobrepor a imagem:

      Public Function SobreporImagem(ByVal nova_imagem As Image, ByVal caminho_daimagem As String) As Boolean
        Try
          If IO.File.Exists(caminho_daimagem) Then
            IO.File.Delete(caminho_daimagem)
          End If
          nova_imagem.Save(caminho_daimagem)
          Return True 'se nao ocorer erro nenhum retorna True
    
        Catch
          Return False 'se ocorrer algum erro retorna false
        End Try
    
      End Function
      Public Function Load_Image(ByVal caminho As String) As Image
        Dim imgtemp As Image = Image.FromFile(caminho)
        Dim r As Image = imgtemp
        imgtemp.Dispose()
        Return r
      End Function
    para que seu aplicativo funcione corretamente você deverá utilizar as duas funções.
    quarta-feira, 30 de junho de 2010 11:21

Todas as Respostas

  • com que rotina você está salvando?

    Tenho algo parecido aqui, não sei se vai te servir mas lá vai!

    Imports System.IO 

    If File.Exists("Caminho e no me da foto ex: C:\paciente_1.jpg") Then File.Delete("C:\paciente_1.jpg") End If 'Aí agora vc copia a foto de novo!

     

    Bem veja se é isso que vc está querendo!

    Se ajudou marque com útil!


    Wesley Reuel Se foi útil, marque como tal! Save The Programmer, Save The World!
    • Editado WReuel terça-feira, 29 de junho de 2010 12:39 Acrescimo de código
    terça-feira, 29 de junho de 2010 12:39
  • quando eu coloco este comando me aparece o seguinte erro:

    O processo não pode acessar o arquivo 'C:\Documents and Settings\user\Desktop\CM 28-06-2010\Michel Hanna Riachi - CM\bin\Debug\Resources\paciente2_3.jpg' porque ele está sendo usado por outro processo.

     

    terça-feira, 29 de junho de 2010 13:25
  • Uma sugestão

    Porque não salvar imagem no proprio banco,ja que deixa-la em uma determinada pasta do sistema dificulta e vc podera ter problemas com arquivos!

    terça-feira, 29 de junho de 2010 13:27
  • estava fazendo da seguinte forma:

    If lbl_caminho.Text <> "" Then
                            If MsgBox("Deseja realmente alterar a foto do Paciente?", MsgBoxStyle.YesNo, "Atenção") = MsgBoxResult.Yes Then
                                alterafoto = lbl_caminho_salvo.Text 'recebendo o caminho da foto anterior
                                numerofoto = CInt(lbl_cod_paciente.Text)

                                Try
                                    My.Computer.FileSystem.CopyFile(lbl_caminho.Text, caminho_executavel + "\paciente1_" + Convert.ToString((numerofoto)) + ".jpg")
                                    Label22.Text = caminho_executavel + "\paciente1_" + Convert.ToString((numerofoto)) + ".jpg"
                                Catch
                                    My.Computer.FileSystem.CopyFile(lbl_caminho.Text, caminho_executavel + "\paciente2_" + Convert.ToString((numerofoto)) + ".jpg")
                                    Label22.Text = caminho_executavel + "\paciente2_" + Convert.ToString((numerofoto)) + ".jpg"
                                End Try
                            End If
                        End If



    sequencia de atualizações de tabela

     

    My.Computer.FileSystem.DeleteFile(alterafoto)'ou seja deleta a foto anterior apos atualizar no banco o caminho e o nome da nova foto

     

    porem ocorre o mesmo erro descrito acima

     

    terça-feira, 29 de junho de 2010 13:39
  • É você terá que apagar antes de executar a substuição, ou seja na hora que confirmar que o usuário confirmarq eu deseja trocar a foto você deve apagar! Veja se você está com todas as permissões na pasta e a se a foto não esta aberta no sistema!

    Wesley Reuel Se foi útil, marque como tal! Save The Programmer, Save The World!
    terça-feira, 29 de junho de 2010 13:52
  • só lembrando que o erro

    O processo não pode acessar o arquivo 'C:\Documents and Settings\user\Desktop\CM 28-06-2010\Michel Hanna Riachi - CM\bin\Debug\Resources\paciente2_3.jpg' porque ele está sendo usado por outro processo.

    só aparece quando eu mando deletar o arquivo que esta na pasta

    que tipo de permissões na pasta ?????

     

     

     

    terça-feira, 29 de junho de 2010 13:58
  • Bem, como você está fazendo isso dentro da pasta do projeto o erro pode ser do visual studio referenciando essa imagem ou algo do tipo, então recomendo que mude para efeitos de teste o local que você está salvando a foto! E verifica se dá certo! As permissões são de administrador, lembre que no windows 7 vc tem que está rodando o visual studio como administrador pra fazer certas coisas!
    Wesley Reuel Se foi útil, marque como tal! Save The Programmer, Save The World!
    terça-feira, 29 de junho de 2010 14:50
  • mesmo trocando a pasta apenas para testes ainda nao esta funcionando

    vc sabe como eu posso gravar a imagem no banco de dados SQL server???

    talves seja melhor gravar a imagem e puxar para o picturebox do que buscar pelo caminho.

    terça-feira, 29 de junho de 2010 15:07
  • Seguinte segue um código que usei para Web veja se você consegu

    Dim imageBytes As Byte() = New Byte(FileUpload1.PostedFile.InputStream.Length) {}
            FileUpload1.PostedFile.InputStream.Read(imageBytes, 0, imageBytes.Length)
               Dim ta As New dsPedidoTableAdapters.PedidoTableAdapter
                ta.stpBoletoIns(Val(idcli.Text), Val(ped.Text), imageBytes)

    Onde o meu ta é uma table adapter você pode fazer normalmente como procedure... Lembrando que a o procedure no campo de imageBytes deve esperar um tipo varbinary(max) e o campo que vai ser inserido tbm!


    Wesley Reuel Se foi útil, marque como tal! Save The Programmer, Save The World!
    terça-feira, 29 de junho de 2010 15:50
  • o que é este fileupload1?????
    terça-feira, 29 de junho de 2010 17:12
  • Esse é um componente do Asp.Net que eu usei, no seu caso vai ser o OpenFileDialog já que é pra WindowsForm

    Wesley Reuel Se foi útil, marque como tal! Save The Programmer, Save The World!
    terça-feira, 29 de junho de 2010 17:42
  • ainda estou com problemas para converter esse codigo xD

    me da uma ajudinha

    terça-feira, 29 de junho de 2010 18:33
  • Rodrigo,

    A resposta do Wreuel está parcialmente correta.

    Qunado você carrega a foto no seu aplicativo deve estar usando algo parecido com isso:

    Dim imageusuario As Image = Image.FromFile (caminho da imagem)

    a aí que está o erro.se você carregar a imagem desse jeito o arquivo permanecerá aberto.

    Para voce corrigir isso o código de carregamento da imagem deverá ficar assim:

    Dim imgTemp As Image = Image.FromFile (caminho da imagem)

    Dim imageusuario As Image = imgTemp

    imgTemp.Dispose()

    Usando o método Dispose você irá desalocar a memória alocada para imgTemp e consequentement fechar o arquivo da imagem.

    Espero ter te ajudado

    quarta-feira, 30 de junho de 2010 11:01
  • Caro, segue dois códigos:

    Esses de abaixo estão em C# e Asp.Net, veja aí o se consegue! Qualquer coisa, estamos a disposição

    http://www.macoratti.net/09/04/asp_ribd.htm (Recuperar Imagem)

    http://www.macoratti.net/09/03/asp_sibd.htm (Salvar Imagem)

    Daqui para baixo estão em Vb.Net

    http://www.macoratti.net/10/02/vbn_sqlt2.htm (Salvando Imagem com SQL Lite e WinForm)


    If dlgFoto.ShowDialog = DialogResult.OK Then
    
            strArquivo = dlgFoto.FileName
    
            Dim fs As New FileStream(Trim(strArquivo), FileMode.Open)
            Dim Data() As Byte = New [Byte](fs.Length) {}
            fs.Read(Data, 0, fs.Length)
    
            'Proceduere que irá salvar a foto essa que tenho aqui
            'Já essa que comentei é a que uso aqui
            'oOperadores.SalvarFoto(STR_USUARIOLOGIN, ctrOperador.txt.Tag, Data)
    
            Dim c As SqlClient.SqlConnection = New SqlClient.SqlConnection(stringConexao)
    
            c.Open()
            
            Dim cmd As SqlClient.SqlCommand
            cmd.CommandText = "INSERT INTO FOTO(Codigo, Foto) Values ('" + Codigo + "')" + ",@image)"
            cmd.Parameters.Add("@image", Data)
            cmd.Parameters.AddWithValue("Codigo", seucodigo)
            cmd.ExecuteNonQuery()
            c.Close()
            fs.Close()
    
            MsgInformacao("Foto inserida com sucesso.")
    
            Dim ds As DataSet = oOperadores.LerFoto(STR_USUARIOLOGIN, ctrOperador.txt.Tag)
    
            If ds.Tables(0).Rows.Count > 0 Then
    
              Dim bits As Byte() = CType(ds.Tables(0).Rows(0).Item("operadorfoto"), Byte())
              Dim memorybits As New MemoryStream(bits)
              Dim bitmap As New Bitmap(memorybits)
              pctFoto.Image = bitmap
    
            End If
    Se for útil marque como tal.


    Wesley Reuel Se foi útil, marque como tal! Save The Programmer, Save The World!
    quarta-feira, 30 de junho de 2010 11:04
  • Rodrigo Criei duas funções. Uma pra carregar a imagem corretamente e outra para sobrepor a imagem:

      Public Function SobreporImagem(ByVal nova_imagem As Image, ByVal caminho_daimagem As String) As Boolean
        Try
          If IO.File.Exists(caminho_daimagem) Then
            IO.File.Delete(caminho_daimagem)
          End If
          nova_imagem.Save(caminho_daimagem)
          Return True 'se nao ocorer erro nenhum retorna True
    
        Catch
          Return False 'se ocorrer algum erro retorna false
        End Try
    
      End Function
      Public Function Load_Image(ByVal caminho As String) As Image
        Dim imgtemp As Image = Image.FromFile(caminho)
        Dim r As Image = imgtemp
        imgtemp.Dispose()
        Return r
      End Function
    para que seu aplicativo funcione corretamente você deverá utilizar as duas funções.
    quarta-feira, 30 de junho de 2010 11:21
  • E aí Rodrigo O. deu certo?

    Wesley Reuel Se foi útil, marque como tal! Save The Programmer, Save The World!
    quarta-feira, 30 de junho de 2010 18:18
  • OI entao deu certo sim

    obrigado

    aproveitando deixa eu te perguntar

    pediram pra mim colocar isso como se fosse uma webcan

    o cara vai tira a foto pela webcan e ja aparece automaticamente no programa

    tem como ser feito isso ????

    quinta-feira, 1 de julho de 2010 18:14
  • Rodrigo,

    Para capturar uma imagem da webcam terás que usar API do Windows.

    Os links abaixo tratam disso bem detalhadamente:

    http://www.macoratti.net/07/08/vbn_wbc.htm

    http://www.macoratti.net/07/08/vbn_ccwb.htm

     

    quinta-feira, 1 de julho de 2010 18:34
  • ola herbert

    consegui incorporar a webcan no projeto mas infelizmente nao estou sabendo como pegar a imagem e converter para bytes

    quando utilizava a imagem que o usuario seleciona eu usava o seguinte codigo para converter

     

     'CONVERTE A FOTO EM BYTES PARA SALVAR NO BANCO

                    ' Cria um novo FileStream para leitura da imagem
                    Dim fs As New IO.FileStream(caminho_foto, IO.FileMode.Open, IO.FileAccess.Read)

                    ' Cria um array de Bytes do tamanho do FileStream
                    Dim ImageData(fs.Length() - 1) As Byte
                    'If caminho_foto <> "" Then
                    ' Lê os bytes do FileStream para o array criado
                    fs.Read(ImageData, 0, ImageData.Length)

                    ' Fecha o FileStream ficando a imagem guardada no array
                    fs.Close()
                    'End If

     

    mas agora como nao tem caminho nao sei como posso converter

    sera que tem alguma forma de converter ditreto do picturebox

    terça-feira, 6 de julho de 2010 18:51
  • Rodrigo,

    Basta voce salvar a imagem do picturebox em um arquivo temp e depois ler os bytes do arquivo como você fazia:

        Dim bmp As New Bitmap(PictureBox1.Image)
        bmp.Save("C:\imgTEMP.temp")
        bmp.Dispose()
        Dim fs As New IO.FileStream("C:\imgTEMP.temp", IO.FileMode.Open, IO.FileAccess.Read)
    
        ' Cria um array de Bytes do tamanho do FileStream 
        Dim ImageData(fs.Length() - 1) As Byte
        'If caminho_foto <> "" Then
        ' Lê os bytes do FileStream para o array criado
        fs.Read(ImageData, 0, ImageData.Length)
    
        ' Fecha o FileStream ficando a imagem guardada no array
        fs.Close()
        'End If
        IO.File.Delete("C:\imgTEMP.temp")
    • Marcado como Resposta Rodrigo.O quarta-feira, 7 de julho de 2010 14:12
    quarta-feira, 7 de julho de 2010 10:39
  • Valew herbert  o codigo funcionou 100%

     

    quarta-feira, 7 de julho de 2010 14:12