none
como desenhar em cima da figura Picture box e salvar

    Question

  • Olá, pessoal.

    Sou novato na programação VB2010.

    Estou desenvolvendo um programa e tenho "montão" de dúvidas...

    Bom... pra começar:
    - Quero desenhar em cima da imagem PictureBox que abri com comando Open e depois salvá-la.

    Até onde consegui:
    - Consigo desenhar no painel de Picture Box (queria saber também, como fazer para apagar o que desenhei..ás vezes é necessário apagar,certo?)
    - Consigo abrir (Open) uma figura no PictureBox.

    Problemas:
    - Não sonsigo desenhar em cima da figura aberta.

    Alguém poderia me ajudar??

    Código que tenho:

    Public Class Form1

        Dim xStart, yStart, xEnd, yEnd As Integer

        Dim PintarBitmap As Bitmap

        Dim Pintura As Graphics

        Dim Caneta As New Pen(Color.BlueViolet, 2)

        Dim MinhaCor As Color = Color.Blue

        Dim MeuBrush As New Drawing.SolidBrush(Color.Red)

        Dim MeuBrushLargura As Integer

        Dim ContinuousFlag As Boolean

     

     

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

            PintarBitmap = New Bitmap(PictureBox1.Width, PictureBox1.Height)

            Pintura = Graphics.FromImage(PintarBitmap)

            PictureBox1.Image = PintarBitmap

            Pintura.Clear(Color.White)

            MeuBrushLargura = 3

        End Sub

     

     

     

        Private Sub drawMyline()

            PictureBox1.Image = PintarBitmap

            Pintura.SmoothingMode = Drawing2D.SmoothingMode.HighQuality

            Pintura.DrawLine(Caneta, xStart, yStart, xEnd, yEnd)

        End Sub

     

     

     

        Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown

     

            xStart = Control.MousePosition.X - (Me.Left + PictureBox1.Left + 4)

            yStart = Control.MousePosition.Y - (Me.Top + PictureBox1.Top + 31)

     

            If CheckBox1.Checked = True Then

                ContinuousFlag = True

            End If

     

        End Sub

     

     

     

        Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove

     

     

            If ContinuousFlag Then

                Pintura.SmoothingMode = Drawing2D.SmoothingMode.None

                Pintura.FillEllipse(MeuBrush, e.X, e.Y, MeuBrushLargura, MeuBrushLargura)

                PictureBox1.Image = PintarBitmap

            End If

     

        End Sub

     

     

     

        Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp

     

            xEnd = Control.MousePosition.X - (Me.Left + PictureBox1.Left + 4)

            yEnd = Control.MousePosition.Y - (Me.Top + PictureBox1.Top + 31)

     

            If CheckBox1.Checked Then

                ContinuousFlag = False

            Else

                drawMyline()

            End If

     

        End Sub

     

     

        Private Sub OpenToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenToolStripButton.Click

     

            OpenFileDialog1.Filter = "bitmaps(*.bmp)|*.bmp|(*.jpg)|*.jpg"

            If OpenFileDialog1.ShowDialog() = DialogResult.OK Then

                PictureBox1.Image = System.Drawing.Image.FromFile(OpenFileDialog1.FileName)

            End If

        End Sub

     

    • Edited by Novato2010 Monday, July 05, 2010 6:35 PM
    Monday, July 05, 2010 4:01 PM

Answers

  • ´Novato2010,

    Desculpe pela demora em responder,

    Corrigi o seu código e implenebtei um botão de desfazer e um para salvar. O Código corrigido vai abaixo:

    Public Class Form1
      Dim undo_image As Image
      Dim xStart, yStart, xEnd, yEnd As Integer
      Dim PintarBitmap As Bitmap
      Dim Pintura As Graphics
      Dim Caneta As New Pen(Color.BlueViolet, 2)
      Dim MinhaCor As Color = Color.Blue
      Dim MeuBrush As New Drawing.SolidBrush(Color.Red)
      Dim MeuBrushLargura As Integer
      Dim ContinuousFlag As Boolean
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MeuBrushLargura = 100
      End Sub
      Private Sub drawMyline()
        Pintura.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
        Pintura.DrawLine(Caneta, xStart, yStart, xEnd, yEnd)
        PictureBox1.Image = PintarBitmap
      End Sub
      Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    
        xStart = Control.MousePosition.X - (Me.Left + PictureBox1.Left + 4)
        yStart = Control.MousePosition.Y - (Me.Top + PictureBox1.Top + 31)
        If CheckBox1.Checked = True Then
          ContinuousFlag = True
        End If
      End Sub
      Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        If ContinuousFlag Then
          Pintura.SmoothingMode = Drawing2D.SmoothingMode.None
          Pintura.FillEllipse(MeuBrush, e.X, e.Y, MeuBrushLargura, MeuBrushLargura)
          PictureBox1.Image = PintarBitmap
        End If
      End Sub
      Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        xEnd = Control.MousePosition.X - (Me.Left + PictureBox1.Left + 4)
        yEnd = Control.MousePosition.Y - (Me.Top + PictureBox1.Top + 31)
        If CheckBox1.Checked Then
          ContinuousFlag = False
        Else
          drawMyline()
        End If
      End Sub
      Private Sub OpenToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenToolStripButton.Click
        OpenFileDialog1.Filter = "bitmaps(*.bmp)|*.bmp|(*.jpg)|*.jpg"
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
          PictureBox1.Image = System.Drawing.Image.FromFile(OpenFileDialog1.FileName)
        End If
        PintarBitmap = New Bitmap(PictureBox1.Image)
        Pintura = Graphics.FromImage(PintarBitmap)
        undo_image = PictureBox1.Image
      End Sub
    
      Private Sub UndoButon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UndoButon.Click
        PintarBitmap = New Bitmap(undo_image)
        PictureBox1.Image = PintarBitmap
        Pintura = Graphics.FromImage(PintarBitmap)
      End Sub
    
      Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click
        Dim s As New SaveFileDialog
        s.Filter = "Bitmap (*.bmp)|*.bmp"
        If s.ShowDialog = Windows.Forms.DialogResult.Cancel Then
          Exit Sub
        Else
          PictureBox1.Image.Save(s.FileName)
        End If
      End Sub
    End Class
    

     

    UndoButon: É o botão de desfazer.

    btnSalvar: É o botão de salvar a imagem.

    Att

    Tuesday, July 06, 2010 10:01 AM

All replies

  • Olá Novato2010,

    Vamos às suas dúvidas:

    Criar a opção Desfazer: Existem muitas maneiras de criar a função desfazer em seu programa. AS principais são: Desfazer de uma única alteração. Por Exemplo: VocÊ abre uma imagem e desenha um circulo e uma linha.Neste caso você só poderá desfazer a linha.

    Para  Criar um Desfazer de um estágio só, basta você declarar uma variável do tipo image.Observe o código abaixo:

    Public Class Form1
      Dim undo_image As Image
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        PictureBox1.Load("C:\imagem.jpg")
        'Salva a imagem na variavel undo_image antes de quanquer alteração
        undo_image = PictureBox1.Image
        'desenha um retângulo na imagem do picturebox
        Dim bp As New Bitmap(PictureBox1.Image)
        Dim gf As Graphics = Graphics.FromImage(bp)
        gf.DrawRectangle(Pens.Black, 5, 5, 100, 50)
        PictureBox1.Image = bp
      End Sub
    End Class

    Agora para criar um histórico de alterações você poderá usar um List (Of Bitmap).

    Quanto à sua outra pergunta de desenhar em cima da figura aberta, o código abaixo mostra como fazer isso:

        'carregar a imagem no picturebox
        PictureBox1.Load("C:\imagem.jpg")
        'declarar um novo bitmap apartir da imagem do picturebox
        Dim bp As New Bitmap(PictureBox1.Image)
        Dim gf As Graphics = Graphics.FromImage(bp)
        'desenhar um retângulo na variável bp
        gf.DrawRectangle(Pens.Black, 5, 5, 100, 50)
        'exibir no picturebox a imagem com o retângulo
        PictureBox1.Image = bp

    Espero ter ajudado.

    Monday, July 05, 2010 4:38 PM
  • Agradeço pelas dicas, mas não sei aonde devo inserir (substituir).

    Poderia apontar o erro nos códigos que tenho?

    Obrigado

    Monday, July 05, 2010 6:41 PM
  • ´Novato2010,

    Desculpe pela demora em responder,

    Corrigi o seu código e implenebtei um botão de desfazer e um para salvar. O Código corrigido vai abaixo:

    Public Class Form1
      Dim undo_image As Image
      Dim xStart, yStart, xEnd, yEnd As Integer
      Dim PintarBitmap As Bitmap
      Dim Pintura As Graphics
      Dim Caneta As New Pen(Color.BlueViolet, 2)
      Dim MinhaCor As Color = Color.Blue
      Dim MeuBrush As New Drawing.SolidBrush(Color.Red)
      Dim MeuBrushLargura As Integer
      Dim ContinuousFlag As Boolean
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MeuBrushLargura = 100
      End Sub
      Private Sub drawMyline()
        Pintura.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
        Pintura.DrawLine(Caneta, xStart, yStart, xEnd, yEnd)
        PictureBox1.Image = PintarBitmap
      End Sub
      Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
    
        xStart = Control.MousePosition.X - (Me.Left + PictureBox1.Left + 4)
        yStart = Control.MousePosition.Y - (Me.Top + PictureBox1.Top + 31)
        If CheckBox1.Checked = True Then
          ContinuousFlag = True
        End If
      End Sub
      Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        If ContinuousFlag Then
          Pintura.SmoothingMode = Drawing2D.SmoothingMode.None
          Pintura.FillEllipse(MeuBrush, e.X, e.Y, MeuBrushLargura, MeuBrushLargura)
          PictureBox1.Image = PintarBitmap
        End If
      End Sub
      Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        xEnd = Control.MousePosition.X - (Me.Left + PictureBox1.Left + 4)
        yEnd = Control.MousePosition.Y - (Me.Top + PictureBox1.Top + 31)
        If CheckBox1.Checked Then
          ContinuousFlag = False
        Else
          drawMyline()
        End If
      End Sub
      Private Sub OpenToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenToolStripButton.Click
        OpenFileDialog1.Filter = "bitmaps(*.bmp)|*.bmp|(*.jpg)|*.jpg"
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
          PictureBox1.Image = System.Drawing.Image.FromFile(OpenFileDialog1.FileName)
        End If
        PintarBitmap = New Bitmap(PictureBox1.Image)
        Pintura = Graphics.FromImage(PintarBitmap)
        undo_image = PictureBox1.Image
      End Sub
    
      Private Sub UndoButon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UndoButon.Click
        PintarBitmap = New Bitmap(undo_image)
        PictureBox1.Image = PintarBitmap
        Pintura = Graphics.FromImage(PintarBitmap)
      End Sub
    
      Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click
        Dim s As New SaveFileDialog
        s.Filter = "Bitmap (*.bmp)|*.bmp"
        If s.ShowDialog = Windows.Forms.DialogResult.Cancel Then
          Exit Sub
        Else
          PictureBox1.Image.Save(s.FileName)
        End If
      End Sub
    End Class
    

     

    UndoButon: É o botão de desfazer.

    btnSalvar: É o botão de salvar a imagem.

    Att

    Tuesday, July 06, 2010 10:01 AM
  • Muito obrigado pelas dica.

    Funcionou perfeitamente.
    Fiz algumas adaptações e está ficando bom.

    Não querendo te abusar, poderia me dizer se existe algum código que acusa caso não tiver nenhuma imagem no PictureBox?

    Porque, toda vez que clico no pictureBox quando não tiver nenhuma imagem carregada, ocorre erro.

    Por isso, a minha idéia é:
    Caso não tiver nenhuma imagem no PictureBox e ao ser clicado,...exit sub (ou seja, não aconteça nada ou dê uma mensagem de alerta do tipo "Insira uma imagem")

    Obrigado

    Wednesday, July 07, 2010 4:27 PM
  • A verificação é bem simples

    coloque

    If PictureBox1.Image Is Nothing Then Exit Sub

    onde está gerando o erro.


    []s.

    Alan. Twitter
    Wednesday, July 07, 2010 7:22 PM
  • Novato2010,

    Basta você usar TRY CATCH END TRY no código:

    Public Class Form1
      Dim undo_image As Image
      Dim xStart, yStart, xEnd, yEnd As Integer
      Dim PintarBitmap As Bitmap
      Dim Pintura As Graphics
      Dim Caneta As New Pen(Color.BlueViolet, 2)
      Dim MinhaCor As Color = Color.Blue
      Dim MeuBrush As New Drawing.SolidBrush(Color.Red)
      Dim MeuBrushLargura As Integer
      Dim ContinuousFlag As Boolean
      Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        MeuBrushLargura = 100
      End Sub
      Private Sub drawMyline()
        Try
          Pintura.SmoothingMode = Drawing2D.SmoothingMode.HighQuality
          Pintura.DrawLine(Caneta, xStart, yStart, xEnd, yEnd)
          PictureBox1.Image = PintarBitmap
        Catch ex As Exception
          Exit Sub
        End Try
      End Sub
      Private Sub PictureBox1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
        Try
          xStart = Control.MousePosition.X - (Me.Left + PictureBox1.Left + 4)
          yStart = Control.MousePosition.Y - (Me.Top + PictureBox1.Top + 31)
          If CheckBox1.Checked = True Then
            ContinuousFlag = True
          End If
        Catch ex As Exception
          Exit Sub
        End Try
      End Sub
      Private Sub PictureBox1_MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseMove
        Try
          If ContinuousFlag Then
            Pintura.SmoothingMode = Drawing2D.SmoothingMode.None
            Pintura.FillEllipse(MeuBrush, e.X, e.Y, MeuBrushLargura, MeuBrushLargura)
            PictureBox1.Image = PintarBitmap
          End If
        Catch ex As Exception
          Exit Sub
        End Try
      End Sub
      Private Sub PictureBox1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseUp
        Try
          xEnd = Control.MousePosition.X - (Me.Left + PictureBox1.Left + 4)
          yEnd = Control.MousePosition.Y - (Me.Top + PictureBox1.Top + 31)
          If CheckBox1.Checked Then
            ContinuousFlag = False
          Else
            drawMyline()
          End If
        Catch ex As Exception
          Exit Sub
        End Try
      End Sub
      Private Sub OpenToolStripButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OpenToolStripButton.Click
        Try
          OpenFileDialog1.Filter = "bitmaps(*.bmp)|*.bmp|(*.jpg)|*.jpg"
          If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            PictureBox1.Image = System.Drawing.Image.FromFile(OpenFileDialog1.FileName)
          End If
          PintarBitmap = New Bitmap(PictureBox1.Image)
          Pintura = Graphics.FromImage(PintarBitmap)
          undo_image = PictureBox1.Image
        Catch ex As Exception
          Exit Sub
        End Try
      End Sub
    
      Private Sub UndoButon_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles UndoButon.Click
        Try
          PintarBitmap = New Bitmap(undo_image)
          PictureBox1.Image = PintarBitmap
          Pintura = Graphics.FromImage(PintarBitmap)
        Catch ex As Exception
          Exit Sub
        End Try
    
      End Sub
    
      Private Sub btnSalvar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSalvar.Click
        Try
          Dim s As New SaveFileDialog
          s.Filter = "Bitmap (*.bmp)|*.bmp"
          If s.ShowDialog = Windows.Forms.DialogResult.Cancel Then
            Exit Sub
          Else
            PictureBox1.Image.Save(s.FileName)
          End If
        Catch ex As Exception
          Exit Sub
        End Try
    
      End Sub
    End Class

    Se você quiser que apareça uma mensagem ao invés dó Exit Sub, troque Exit sub nas partes do código que quiser que apareça a mensagem e substitua por MSGBOX("ERRO")

    Att

    Wednesday, July 07, 2010 8:11 PM
  • Caros amigos, Alan e Herbert.

    Agradeço muito pelas informações.
    Cosegui resolver o problema.
    (Principalmente as dicas de Herbert foram importantíssimo para finalizar a etapa que iniciei).

    Agora tenho a próxima etapa a vencer:

    Como inserir uma busca pelo nome.

    A situação atual:

    1) Criei Banco de dados (Registros com Nome, Endereço, Profissão, etc) no Access.
    2) Criei programa VB (Form com Tab Pages)
    3) Após gerar Data Source no VB, criei objetos vinculados com Banco de dados no Form
    4) Também, inseri DataGridView no Form para visualizar os registros.

    Dúvida é:
    Como criar um mecanismo de busca? Por ex. pelo Nome

    Atualmente, faço busca utilizando DataGridView, mas já imaginou se tiver 1000 resgistros??

    Por isso, mais uma vez recorro a boa vontade dos colegas (Doutores em VB) para dar umas dicas preciosas.....

    Muito obrigado pela atenção.

    Thursday, July 08, 2010 10:02 PM
  • Novato2010,

    Pesquisei por artigos na internet e só consegui achar este:

    http://www.macoratti.net/vbnet_7.htm

    Sugiro que você inicie uma nova pergunta, pois assim mais colegas de forum poderão te ajudar.

    Eu nunca criei umas aplicaçã com banco de dados, então naõ poderei lhe ajudar muito.

    No site do Macoratti você vai encontrar mais artigos sobre o assunto.

    ^_^

    Friday, July 09, 2010 10:43 AM
  • Oi Herbert.

    Muito obrigado pela atenção.

    Vou iniciar uma nova pergunta.

    Um grande abç,

     

    Friday, July 09, 2010 9:53 PM