none
¿Cómo puedo obtener una imagen con el contenido de un Picture box? (explico)

    Pregunta

  • Quiero obtener una imagen con el contenido interno del picture box.

    Por ejemplo en la imagen que muestro el borde negro corresponde a un control PictureBox, lo que consulto es cómo obtengo una imagen con el contenido tal cual está, observen que tiene partes en blanco quiero obtener la imagen con esas partes en blanco y que si pongo la imagen más pequeña, las áreas en blanco serán más grandes.

    En otras palabras lo que trato de hacer es sacarle una foto a todo lo que está dentro del borde negro, tal y como está.


    • Editado James-2016 viernes, 16 de diciembre de 2016 21:50
    viernes, 16 de diciembre de 2016 21:50

Respuestas

  • Hola James-2016,

    En pocas palabras quieres 'dibujar el control' y guardarla en una variable para poder usar la imagen ? Si es así podrías hacer uso del método DrawToBitmap(...) de tu PictureBox.

    Dim bitm As New Bitmap(PictureBox1.Width, PictureBox1.Height)
    PictureBox1.DrawToBitmap(bitm, New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height))
    
    Me.BackgroundImage = bitm  'Para ver como quedó la imagen (Opcional)

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta James-2016 viernes, 16 de diciembre de 2016 23:17
    viernes, 16 de diciembre de 2016 22:15
  • Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim bmp As New Bitmap(PictureBox1.Size.Width, PictureBox1.Size.Height)
            Dim pu As GraphicsUnit = GraphicsUnit.Pixel
            Dim r As Rectangle = Rectangle.Truncate(bmp.GetBounds(pu))
    
            PictureBox1.DrawToBitmap(bmp, r)
    
            bmp.Save("c:\miqui\algo.jpg", Imaging.ImageFormat.Jpeg)
        End Sub
    End Class

    El punto a destacar, es el uso de las dimensiones de la ventana del control y no de su "client area".

    El borde de una ventana forma parte de su "non-client-area".

    ---

    JPEG te resultará un formato asqueroso, ya que debido a la existencia del fondo blanco (un color sólido fuertemente contrastante), vas a observar la creación de gran número de "artifacts", unos cuadraditos de color del tamaño del rectángulo usado por el algoritmo como unidad de compresión.

    • Editado miqui quilmes viernes, 16 de diciembre de 2016 22:39
    • Marcado como respuesta James-2016 viernes, 16 de diciembre de 2016 23:17
    viernes, 16 de diciembre de 2016 22:34

Todas las respuestas

  • Hola James-2016,

    En pocas palabras quieres 'dibujar el control' y guardarla en una variable para poder usar la imagen ? Si es así podrías hacer uso del método DrawToBitmap(...) de tu PictureBox.

    Dim bitm As New Bitmap(PictureBox1.Width, PictureBox1.Height)
    PictureBox1.DrawToBitmap(bitm, New Rectangle(0, 0, PictureBox1.Width, PictureBox1.Height))
    
    Me.BackgroundImage = bitm  'Para ver como quedó la imagen (Opcional)

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    • Marcado como respuesta James-2016 viernes, 16 de diciembre de 2016 23:17
    viernes, 16 de diciembre de 2016 22:15
  • hola james creo que este articulo te sirva

    https://www.codeproject.com/Articles/506039/A-scrollable-zoomable-and-scalable-picture-box

    viernes, 16 de diciembre de 2016 22:15
  • Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim bmp As New Bitmap(PictureBox1.Size.Width, PictureBox1.Size.Height)
            Dim pu As GraphicsUnit = GraphicsUnit.Pixel
            Dim r As Rectangle = Rectangle.Truncate(bmp.GetBounds(pu))
    
            PictureBox1.DrawToBitmap(bmp, r)
    
            bmp.Save("c:\miqui\algo.jpg", Imaging.ImageFormat.Jpeg)
        End Sub
    End Class

    El punto a destacar, es el uso de las dimensiones de la ventana del control y no de su "client area".

    El borde de una ventana forma parte de su "non-client-area".

    ---

    JPEG te resultará un formato asqueroso, ya que debido a la existencia del fondo blanco (un color sólido fuertemente contrastante), vas a observar la creación de gran número de "artifacts", unos cuadraditos de color del tamaño del rectángulo usado por el algoritmo como unidad de compresión.

    • Editado miqui quilmes viernes, 16 de diciembre de 2016 22:39
    • Marcado como respuesta James-2016 viernes, 16 de diciembre de 2016 23:17
    viernes, 16 de diciembre de 2016 22:34
  • Gracias, pero no obtengo el resultado esperado, el código anterior captura la imagen pero no la parte en blanco. Tal vez me expliqué mal, quiero obtener la imagen compuesta por la foto y el fondo blanco.
    viernes, 16 de diciembre de 2016 22:41
  • Sorry, mil disculpas, el que no funcionaba era yo, estaba probando mal es que tengo un control metido en otro y estaba referenciando el control equivocado. El código anterior funciona perfectamente, es lo que quería.
    viernes, 16 de diciembre de 2016 23:17
  • Gracias, lo probé y también funciona.
    viernes, 16 de diciembre de 2016 23:17
  • Un poquito largo el código, de todas maneras gracias.
    viernes, 16 de diciembre de 2016 23:18