none
Grabar dibujo de PictureBox en Sql Server RRS feed

  • Pregunta

  • Hola a todos

    Tengo un Programa donde de acuerdo a parámetros hago unos dibujos con líneas en un pictureBox, funciona muy bien.. El Problema radica en querer grabar ese dibujo en la base de datos como una imagen, obtengo un resultado "Object reference not set to an instance of an object." verifico el MemoryStream() y me devuelve vacio o null.

    Si cargo al PictureBox una imagen sea en formato Jpeg, bmp, png etc lo graba sin problemas, pero el dibujo que realizo siempre indica vacio.

    Esta es estas lineas me da error..

     

     Dim ms As New MemoryStream() 'Creamos el MemoryStream.

    PictureBox1.Image.Save(ms, Imaging.ImageFormat.Jpeg)

    Gracias de antemano

    jueves, 12 de noviembre de 2020 12:50

Respuestas

  • mira un ejemplo es paresido al tuyo pero este crea una imagen y se la pasa a la clase graphic para que dibuje sobre la imagen despues se la pasa al picturebox para mostrarla y el picturebox la guarda en formato .jpg

    Imports System.Drawing
    Imports System.Drawing.Imaging
    Imports Microsoft.VisualBasic.FileIO
    
    Public Class Form1
    
        Dim surface As Graphics
        Dim open As Pen
        Dim gr As Brush
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            'Variables para almacenar el ancho y el alto del control PictureBox1
            Dim ancho, alto As Integer
            ancho = PictureBox1.Width
            alto = PictureBox1.Height
    
            'imagen en donde se va a dibujar
            Dim bmp As New Bitmap(ancho, alto)
    
            'Aqui le decimos a la clase graphic que bamos a dibujar en la imagen bmp
            surface = Graphics.FromImage(CType(bmp, Image))
            surface.Clear(Color.White)
    
            open = New Pen(Color.Black, 2)
    
            Dim Mfont As New Font("Arial", 20)
    
            gr = New SolidBrush(Color.Black)
    
            surface.DrawLine(open, CInt(ancho / 2) + 18, 20, CInt(ancho / 2) + 18, alto + 20)
            surface.DrawLine(open, CInt(ancho / 2) + 22, 20, CInt(ancho / 2) + 22, alto + 20)
    
            surface.DrawRectangle(open, 20, 20, ancho, alto)
            surface.DrawRectangle(open, 24, 24, ancho - 8, alto - 8)
            surface.DrawString("vb.net 2019", Mfont, gr, New Rectangle(200, 150, ancho, alto))
    
            PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
            PictureBox1.Image = bmp
    
            'guardamos la imagen 
            Dim archivoImagen As String = (SpecialDirectories.MyPictures & "\NuevaImagen1.jpg")
            PictureBox1.Image.Save(archivoImagen, ImageFormat.Jpeg)
    
            surface.Dispose()
        End Sub
    End Class

    • Marcado como respuesta AlexXaviermm viernes, 13 de noviembre de 2020 12:18
    viernes, 13 de noviembre de 2020 1:20

Todas las respuestas

  • tienes que poner un poco mas de codigo para que tengamos una idea de lo que estas haciendo mal  cuando dibujas en el control PictureBox solo estas dibujando el fondo del control la propiedad Image del control esta vacio porque no tiene ninguna imagen agregada para lograr lo que quieres tendras que guardar tu dibujo en un formato de imagen cualquiera y cargarla en la propiedad Image de lo contrario siempre te mostrara ese mensaje ya que no hay ninguna imagen en la propiedad .Image
    jueves, 12 de noviembre de 2020 14:54
  • Gracias amigo,

    Este es el procedimiento con cual dibujo unos rectángulos y líneas, esta imagen que creo es la que quiero salvar en la base de datos, pero sin duda lo que me escribes es lo que sucede, si me ilustras un poco mas te lo agradeceria.

    private ografico as Graphics

    private oPen as Pen

     Private Sub dibujar(ByVal ancho As Integer, alto As Integer)
            
            oGrafico = PictureBox1.CreateGraphics
            oGrafico.Clear(Color.White)
            oPen = New Pen(Color.Black, 2)


            Dim m_texto As New Font("Arial", 10)
      
            oGrafico.DrawLine(oPen, CInt(ancho / 2) + 18, 20, CInt(ancho / 2) + 18, alto + 20)
            oGrafico.DrawLine(oPen, CInt(ancho / 2) + 22, 20, CInt(ancho / 2) + 22, alto + 20)

            oGrafico.DrawString(txtAlto.Text, m_texto, Brushes.Black, New Rectangle(ancho + 28, (alto / 2) + 4, 50, 135))
            oGrafico.DrawString(txtAncho.Text, m_texto, Brushes.Black, New Rectangle(ancho / 2 + 10, 2, 50, 135))

            oGrafico.DrawRectangle(oPen, 20, 20, ancho, alto)
            oGrafico.DrawRectangle(oPen, 24, 24, ancho - 8, alto - 8)
           
        End Sub

    jueves, 12 de noviembre de 2020 23:19
  • mira un ejemplo es paresido al tuyo pero este crea una imagen y se la pasa a la clase graphic para que dibuje sobre la imagen despues se la pasa al picturebox para mostrarla y el picturebox la guarda en formato .jpg

    Imports System.Drawing
    Imports System.Drawing.Imaging
    Imports Microsoft.VisualBasic.FileIO
    
    Public Class Form1
    
        Dim surface As Graphics
        Dim open As Pen
        Dim gr As Brush
    
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            'Variables para almacenar el ancho y el alto del control PictureBox1
            Dim ancho, alto As Integer
            ancho = PictureBox1.Width
            alto = PictureBox1.Height
    
            'imagen en donde se va a dibujar
            Dim bmp As New Bitmap(ancho, alto)
    
            'Aqui le decimos a la clase graphic que bamos a dibujar en la imagen bmp
            surface = Graphics.FromImage(CType(bmp, Image))
            surface.Clear(Color.White)
    
            open = New Pen(Color.Black, 2)
    
            Dim Mfont As New Font("Arial", 20)
    
            gr = New SolidBrush(Color.Black)
    
            surface.DrawLine(open, CInt(ancho / 2) + 18, 20, CInt(ancho / 2) + 18, alto + 20)
            surface.DrawLine(open, CInt(ancho / 2) + 22, 20, CInt(ancho / 2) + 22, alto + 20)
    
            surface.DrawRectangle(open, 20, 20, ancho, alto)
            surface.DrawRectangle(open, 24, 24, ancho - 8, alto - 8)
            surface.DrawString("vb.net 2019", Mfont, gr, New Rectangle(200, 150, ancho, alto))
    
            PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
            PictureBox1.Image = bmp
    
            'guardamos la imagen 
            Dim archivoImagen As String = (SpecialDirectories.MyPictures & "\NuevaImagen1.jpg")
            PictureBox1.Image.Save(archivoImagen, ImageFormat.Jpeg)
    
            surface.Dispose()
        End Sub
    End Class

    • Marcado como respuesta AlexXaviermm viernes, 13 de noviembre de 2020 12:18
    viernes, 13 de noviembre de 2020 1:20
  • MUCHIIIIISIMAS GRACIAS DANTE-3D

    Estaba confundido con el motivo del error....

    Saludos desde Ecuador

    viernes, 13 de noviembre de 2020 12:19
  • me alegra servirle de ayuda

    saludos y feliz dia

    viernes, 13 de noviembre de 2020 13:35
  • Hola AlexXaviermm

    Gracias por confirmar que se ha encontrado una solución a la consulta realizada. Debido a ello, este hilo será cerrado. 

    Si es necesario, por favor abra un nuevo hilo. 

    Gracias por usar los foros de MSDN. 

     

     Andres Aguilar

    ____________________________ 

      

    viernes, 13 de noviembre de 2020 16:58
    Moderador