Ecco un esempio di codice per stampare una singola immagine.
Imports System.Drawing.Printing Public Class Form1 'definizione del documento da stampare, della finestra Anteprima, della finestra di Stampa e dei due pulsanti Private WithEvents documento As New PrintDocument Private WithEvents PrintPreviewDialog1 As New PrintPreviewDialog Private WithEvents PrintDialog1 As New PrintDialog Private WithEvents btnAnteprima As New Button Private WithEvents btnStampa As New Button Public Sub New() InitializeComponent() 'inizializzazione della Form With Me .Size = New Size(220, 130) .Text = "Stampa Immagini" .Controls.Add(btnAnteprima) .Controls.Add(btnStampa) End With 'inizializzazione del pulsante "Anteprima" With btnAnteprima .Size = New Size(75, 25) .Location = New Point(69, 21) .Text = "Anteprima" End With 'inizializzazione del pulsante "Stampa" With btnStampa .Size = New Size(75, 25) .Location = New Point(69, 50) .Text = "Stampa" End With End Sub Private Sub btnAnteprima_Click(ByVal sender As Object, ByVal e As System.EventArgs) _ Handles btnAnteprima.Click 'si associa il nostro documento di stampa alla finestra di dialogo... PrintPreviewDialog1.Document = documento 'e la si mostra all'utente PrintPreviewDialog1.Show() End Sub Private Sub btnStampa_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnStampa.Click 'come per l'anteprima si associa il nostro documento alla finestra di dialogo PrintDialog1.Document = documento 'e se viene premuto il tasto "OK" la si stampa If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then documento.Print() End If End Sub Private Sub documento_PrintPage(ByVal sender As Object, ByVal e As _ System.Drawing.Printing.PrintPageEventArgs) Handles documento.PrintPage 'impostazione dell'immagine da visualizzare, ne ho scelta una di 800x600 pixels Dim immagine As Image = Image.FromFile("D:\Immagini\Paesaggio_9.jpg") 'rapporto fa la larghezza dell'area stampabile e la larghezza dell'immagine Dim rapportoL As Double = e.MarginBounds.Width / immagine.Width 'rapporto fra l'altezza dell'area stampabile e l'altezza dell'immagine Dim rapportoH As Double = e.MarginBounds.Height / immagine.Height 'larghezza dell'immagine Dim LImmagine As Integer = immagine.Width 'altezza dell'immagine Dim HImmagine As Integer = immagine.Height 'posizione del vertice alto-sx dell'immagine Dim x As Integer = 0 Dim y As Integer = 0 'Se l'immagine è più grande del foglio che deve contenerla, essa viene scalata. 'Per questo si valutano i due rapporti, rapportoL e rapportoH, e si utilizza quello di valore minore, 'poi attraverso una proporzione si scala l'immagine in modo che la relativa dimensione (larghezza per rapportoL, 'altezza per rapportH) sia uguale a quella dell'area stampabile If e.MarginBounds.Width < immagine.Width Or e.MarginBounds.Height < immagine.Height Then If rapportoL < rapportoH Then HImmagine = CType(rapportoL * immagine.Height, Integer) LImmagine = CType(e.MarginBounds.Width, Integer) Else HImmagine = CType(e.MarginBounds.Height, Integer) LImmagine = CType(rapportoH * im magine.Width, Integer) End If End If 'centra l'immagine nel foglio y = CType((e.PageBounds.Height - HImmagine) / 2, Integer) x = CType((e.PageBounds.Width - LImmagine) / 2, Integer) 'si disegna l'immagine alle coordinate (x,y) e con le nuove dimensioni Limmagine e Himmagine e.Graphics.DrawImage(immagine, x, y, LImmagine, HImmagine) End Sub End Class
Download sorgente "Stampa_Immagini.zip" ( 65KB )
E adesso un esempio di codice in cui si stampa una serie di 9 immagini raccolte in una griglia di 3x3.
Imports System.Drawing.Printing Public Class Form1 'definizione del documento da stampare, della finestra Anteprima, della finestra di Stampa e dei due pulsanti Private WithEvents documento As New PrintDocument 'creazione della finestra "Anteprima di Stampa" Private WithEvents PrintPreviewDialog1 As New PrintPreviewDialog 'creazione della finestra "Stampa" Private WithEvents PrintDialog1 As New PrintDialog 'definizione del pulsante per avviare l'"Anteprima Stampa" Private WithEvents btnAnteprima As New Button 'definizione del pulsante per avviare la finsetra "Stampa" Private WithEvents btnStampa As New Button Public Sub New() InitializeComponent() 'inizializzazione della Form With Me .Size = New Size(220, 130) .Text = "Stampa Immagini" .Controls.Add(btnAnteprima) .Controls.Add(btnStampa) End With 'inizializzazione del pulsante "Anteprima" With btnAnteprima .Size = New Size(75, 25) .Location = New Point(69, 21) .Text = "Anteprima" End With 'inizializzazione del pulsante "Stampa" With btnStampa .Size = New Size(75, 25) .Location = New Point(69, 50) .Text = "Stampa" End With End Sub Private Sub btnAnteprima_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAnteprima.Click 'si associa il nostro documento di stampa alla finestra di dialogo... PrintPreviewDialog1.Document = documento 'e la si mostra all'utente PrintPreviewDialog1.Show() End Sub Private Sub btnStampa_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnStampa.Click 'come per l'anteprima si associa il nostro documento alla finestra di dialogo PrintDialog1.Document = documento 'e se viene premuto il tasto "OK" la si stampa If PrintDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then documento.Print() End If End Sub Private Sub documento_PrintPage(ByVal sender As Object, ByVal e As _ System.Drawing.Printing.PrintPageEventArgs) Handles documento.PrintPage 'impostazione delle immagini da visualizzare Dim immagine(0 To 8) As Image 'definizione del rapporto fra la larghezza dell'immagine e quella della pagina Dim rapportoL As Double 'definizione del rapporto fra l'altezza dell'immagine e quella della pagina Dim rapportoH As Double 'definizione della larghezza dell'immagine Dim LImmagine As Integer 'definizione dell'altezza dell'immagine Dim HImmagine As Integer 'coordinate del punto di inserimento delle varie immagini Dim x As Integer = 0 Dim y As Integer = 0 'le immagini che saranno visualizzate immagine(0) = Image.FromFile("D:\Immagini\Paesaggio_1.jpg") immagine(1) = Image.FromFile("D:\Immagini\Paesaggio_2.jpg") immagine(2) = Image.FromFile("D:\Immagini\Paesaggio_3.jpg") immagine(3) = Image.FromFile("D:\Immagini\Paesaggio_4.jpg") immagine(4) = Image.FromFile("D:\Immagini\Paesaggio_5.jpg") immagine(5) = Image.FromFile("D:\Immagini\Paesaggio_6.jpg") immagine(6) = Image.FromFile("D:\Immagini\Paesaggio_7.jpg") immagine(7) = Image.FromFile("D:\Immagini\Paesaggio_8.jpg") immagine(8) = Image.FromFile("D:\Immagini\Paesaggio_9.jpg") 'contatori per determinare la posizione delle immagini nella pagina secondo una griglia di 3x3 Dim j As Integer = 0 Dim k As Integer = 0 For i As Integer = 0 To 8 rapportoL = 160 / immagine(i).Width rapportoH = 120 / immagine(i).Height LImmagine = immagine(i).Width HImmagine = immagine(i).Height 'ridimensiona le immagini in modo che o la larghezza sia 160 px, o l'altezza sia 120 px If immagine(i).Width > 160 Or immagine(i).Height > 120 Then If rapportoL < rapportoH Then HImmagine = CType(rapportoL * immagine(i).Height, Integer) LImmagine = 160 Else HImmagine = 120 LImmagine = CType(rapportoH * immagine(i).Width, Integer) End If End If Dim incX As Integer = CType((e.PageBounds.Width - 480) / 4, Integer) Dim incY As Integer = CType((e.PageBounds.Height - 360) / 4, Integer) x = incX * (k + 1) + 160 * k y = incY * (j + 1) + 120 * j e.Graphics.DrawImage(immagine(i), x, y, LImmagine, HImmagine) If j >= 2 Then j = 0 k += 1 Else j += 1 End If Next End Sub End Class