none
Imprimir Imagen RRS feed

  • Pregunta

  • Buen día,

    Quiero imprimir una imagen, la cual vendra de un picture box, pero dentro de este picture box habra otro picture box y dos labels, ejemplo:

    El picture box principal servira como fondo, otro picture box traera un logo, un label sera un codigo de barras y otro label tendra una leyenda, pero todos dentro de la misma imagen, quiero poder imprimir varias imagenes en la misma hoja.


    

    lunes, 19 de agosto de 2019 17:55

Todas las respuestas

  • Utiliza un objeto PrintDocument. Dispara la impresión llamando a su método Print. Conecta un manejador para el evento PrintPage del PrintDocument. Al evento te llegará un parámetro "e" que contiene e.Graphics, que es el objeto que usarás para llamar a las instrucciones de GDI+ para imprimir. En particular, usarás e.Graphics.DrawImage para dibujar una imagen. El método tiene parámetros para indicar en qué coordenadas de la página se va a imprimir y con que tamaño.

    PERO: Al DrawImage solo le puedes pasar UNA imagen. No hay un automatismo para capturar otros objetos que estén ubicados por encima del picturebox, que aunque visualmente parezcan ser parte de la misma imagen en realidad son imágenes distintas. Así que tendrás que llamar uno por uno a varios métodos de GDI+ para ir imprimiendo cada uno de los objetos requeridos en la posición adecuada de la página, de manera que se solapen igual que los tenías solapados en pantalla. Para los Labels tendrás que usar DrawString, y para las imágenes DrawImage.

    Y sí, es complicado. Al final acabarás escribiendo unos cientos de líneas de código. Si esperabas que existiese una única instrucción que solo con llamarla te imprimiese el picturebox más todo lo que haya por encima, me temo que no, no es tan sencillo. Podrías hacer una captura de pantalla e imprimir la imagen capturada, pero esto también requiere bastante código (aunque lo puedes copiar y pegar), y tiene el inconveniente de que la resolución impresa será mucho menor que usando el método anterior.

    • Propuesto como respuesta Pablo Rubio jueves, 22 de agosto de 2019 15:27
    lunes, 19 de agosto de 2019 18:19
  • Estaba pensando en hacer un Report y ahi formar la imagen que busco, crees que sea posible?
    lunes, 19 de agosto de 2019 18:28
  • Haz una prueba rápida con un report sencillo, creándolo directamente desde el diseñador con dos imágenes "fijas" y un par de textos por encima. Pruébalo y si funciona entonces ya haces el informe "de verdad" pasándole como argumento las imágenes y textos necesarios. Pero me temo que el problema va a ser que no te permita ubicar los distintos elementos solapándose unos encima de otros, o que incluso aunque el diseñador lo permita, no queden correctamente ubicados al momento de imprimirlo. Pruébalo primero con un diseño rápido, a ver si funciona.
    • Propuesto como respuesta Pablo Rubio jueves, 22 de agosto de 2019 15:27
    lunes, 19 de agosto de 2019 19:23
  • Solo para darle la absoluta razón a Alberto (como de costumbre) e probado ingresar una imagen como la que pides con la salvedad de cargarla en otra imagen, tal como decía Alberto a travez de una captura y si... el resultado no es de gran calidad, de echo pierde demasiado, si bien la imagen guardad es, al menos respetable, la impresa no. Pero bueno, el código lo tenía echo de un capturador de pantalla y modifique para el ejemplo

    Imports System.Drawing.Text
    Imports System.Drawing
    Imports System.IO
    Imports System.Text
    Imports System.Drawing.Printing
    
    Public Class Form1
        '--------------------------Generador de código de barras para el ejemplo------------------
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim PathTTF As String = "C:\Users\Dirección del archivo TTF\fre3of9x.ttf"
            Dim PFC As New PrivateFontCollection()
            PFC.AddFontFile(PathTTF)
            Dim NFont As FontFamily = PFC.Families(0)
            Dim Ft As New Font(NFont, 30)
            Label1.Text = TextBox1.Text
            Label1.Font = Ft
    
    
        End Sub
    
        Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
            '-----------------Captura de imagen del PictureBox1 y se carga la imagen final en el PictureBox2----------------------------------
            Dim Gr As Graphics = CreateGraphics()
            Dim NSize As Size = PictureBox1.Size
            Dim Btm As New Bitmap(NSize.Width, NSize.Height - 2, Gr)
            Dim gr2 As Graphics = Graphics.FromImage(Btm) 
            gr2.CopyFromScreen((Me.Location.X + 55), Me.Location.Y + 55, 0, 0, NSize)
            Me.PictureBox2.Size = PictureBox1.Size
            Me.PictureBox2.Image = Btm
            'Tener en cuenta que hay que modificár los valores de Size para que sea correcto a la imagen deseada
        End Sub
    
        Private Sub PrintDocument1_PrintPage(sender As Object, e As PrintPageEventArgs) Handles PrintDocument1.PrintPage
            '--------Imprimir la imagen lograda del PictureBox2
            e.Graphics.DrawImage(PictureBox2.Image, 40, 40)
        End Sub
        '------------Botón de impresión esto solo para el ejémplo-------------------
        Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
            PrintDocument1.Print()
    
        End Sub
    
        Private Sub PictureBox3_DoubleClick(sender As Object, e As EventArgs) Handles PictureBox3.DoubleClick
            'Doble clik en cada picture para cargar la imágen
            Dim OFD As New OpenFileDialog()
            OFD.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF"
            If OFD.ShowDialog = DialogResult.OK Then
                PictureBox3.Image = Image.FromFile(OFD.FileName)
            End If
        End Sub
    
        Private Sub PictureBox1_DoubleClick(sender As Object, e As EventArgs) Handles PictureBox1.DoubleClick
            'Doble clik en cada picture para cargar la imágen
            Dim OFD As New OpenFileDialog()
            OFD.Filter = "Image Files(*.BMP;*.JPG;*.GIF)|*.BMP;*.JPG;*.GIF"
            If OFD.ShowDialog = DialogResult.OK Then
                PictureBox1.Image = Image.FromFile(OFD.FileName)
            End If
        End Sub
    
        Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
            'Salvar la imágen si se desea---------------------
            PictureBox2.Image.Save("C:\Users\dirección del la carpeta\Nueva.jpg", System.Drawing.Imaging.ImageFormat.Jpeg)
        End Sub
    End Class

    Y parafraseando a Alberto ... es una "Chapusada" je

    Saludos



    ARA San Juan 44 HEROES     ‗‗‗‗­|||||‗‗‗‗‗



    • Editado Marcelo PF martes, 20 de agosto de 2019 5:14
    • Propuesto como respuesta Pablo Rubio jueves, 22 de agosto de 2019 15:27
    martes, 20 de agosto de 2019 4:41