IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Imprimer grande image sur plusieurs pages


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 50
    Par défaut Imprimer grande image sur plusieurs pages
    Bonjour!
    Je souhaiterai imprimer une image, qui pourra être grande et dépasser le cadre de la page d'impression. Même avec msdn j'ai du mal à comprendre comment on peut imprimer plusieurs pages automatiquement (car si il est impératif d'imprimer l'image en entier, même sur plusieurs pages). Savez-vous comment faire?

    De plus, j'aimerai que l'on puisse faire un zoom de cette image (en + et surtout en -) si on en a envie, et je n'ai pas trouvé l'option dans les différentes boîtes de dialogues... Ceci n'est pas le principal mais ce serait un plus de pouvoir le faire =)

    Voici mon code ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
            // Procédure impression
            private void Imprimer()
            {
                // Choix de l'imprimante
                printDialog1.Document = leDoc;
                printDialog1.ShowDialog();
     
                // Options portrait/paysage
                pageSetupDialog1.Document = leDoc;
                pageSetupDialog1.ShowDialog();
     
                // Aperçu avant impression
                printPreviewDialog1.Document = leDoc;
                printPreviewDialog1.ShowDialog();
            }
     
            // Impression
            private void leDoc_PrintPage_1(object sender, System.Drawing.Printing.PrintPageEventArgs e)
            // Contient tout mon code pour déterminer ce que j'envois à l'impression

  2. #2
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour elaene


    Même avec msdn j'ai du mal à comprendre comment on peut imprimer plusieurs pages automatiquement
    -l'event PrintDocument_PrintPage une fois demarre est appele autant de fois repetitivement si nous avons un compteur NumPage qui s'incremente et que tant que notre variable TotalPages n'est pas atteinte .
    Quand TotalPages est atteinte nous mettrons sa variable interne e.HasMorePages =False......
    La logique d'impression depend de toi:par exemple imprimer par page à chaque passage dans l'event un ligne d'un tableau de string TableauString ou une image d'une liste d'image ListMyImages,incrementer NumPage et tester si NumPage <=TotalPages.....
    Bien sur il est evident que TotalPages est egal à TableauString.Length dans le cas d'un tableau et TotalPages est egal à ListMyImages.count............


    Je souhaiterai imprimer une image, qui pourra être grande et dépasser le cadre de la page d'impression
    Il suffit de la "cropper" en une serie d'image.Comment la cropper?
    Graphics.DrawImage() a un "overloads" qui permet d'imprimer une zone "croppe" d'une image dans un rectangle que tu dois preciser.....
    Mais comme "devil are in the details" (le diable est dans les details) ,il faut comme toujours "une machination" (terme anglais qui veut dire en francais une machinerie et non machination) pour le faire.
    C'est que je donne dans le 1er exemple code ou le rectangle de "cropp" a ete formulee en taille papier par defaut de l'imprimante(en centieme d'inch) converti ensuite en inch ensuite en pixel.

    Ensuite l'image est decoupee en serie de sous-images de meme taille(c'est une grille sur l'image).... et chaque image est envoye a l'event PrintPage -declenche à chaque impression de page-qui imprime et comptabilise les pages(nombre de fois ou il est appele)......

    exemple code 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
     
    'les calculs sont fait en unites english:
    'inch(pouce en francais) et autres centiemes d'inch
    'l'image est "croppe" en une serie de sous-images dont la taille 
    'est celle du format papier imprimante par defaut....en general A4
    'Ce format peut etre modifie dans l'event QueryPageSettings
    'AJOUTER LES CONTROLS:
    '-4 TEXTEBOX
    '-1 PRINTDOCUMENT
    '-1 PRINTPREVIEW
    '-1 PICTUREBOX
    '-2 BOUTONS
     
    Imports System.Drawing.Drawing2D
    Imports System.Drawing.Printing
     
    Public Class frmPrintImage
        'counter:numero de page à imprimer
        Private numPage As Integer
     
        'total pages à imprimer
        Private totalPages As Integer
     
        'liste des sous-images croppees taille reelle
        Private ListPagesImage As List(Of Bitmap)
     
        'dimension "reelles" de l'image en inch
        Private widthOriginalImage As Single
        Private heightOriginalImage As Single
     
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
            ' Pour connaitre la taille reelle d'image "sortie sur papier"
            ' à partir des dimensions (width et height) donnees en pixel d'une image et 
            ' des resolutions Horizontale et Verticale de l'image donnees
            ' en "Pixel /Inch" (Inch =>pouce en francais)
            '
            ' Size.Width(unite inch)=Size.Width(unite pixel)/ResH(unite:pixel/inch)
            '
            ' Dimensions sont converties en mm car un "Inch" vaut 25.4 mm
            ' Formule sera reutilisee en sens "inverse"  lors du "cropping" plus loin.
     
            ' Real Width in inch 
            widthOriginalImage = (Me.PictureBox1.Image.Width / Me.PictureBox1.Image.HorizontalResolution)
            ' Display Real Width in mm 
            Me.textBoxRealWidth.Text = (widthOriginalImage * 25.4).ToString
     
     
            ' Real Width in inch 
            heightOriginalImage = (Me.PictureBox1.Image.Height / Me.PictureBox1.Image.VerticalResolution)
            'Display Real Height in mm pour la "satisfaction"
            Me.textBoxRealHeight.Text = (heightOriginalImage * 25.4).ToString
     
     
     
            'initialise  variables pour l'impression pour gerer plusieurs pages !
            numPage = 0
            totalPages = 0
            ' Image Originale sera "croppee"  en une serie d'image 
            ' dont la taille correspondra à un format A4
            ' sous-images "croppees" à imprimer seront stockees dans ListPagesImage
            CroopImage()
     
     
        End Sub
        Private Sub CroopImage()
            'Recupere taille papier par  defaut de l'imprimante courante
            'donne en  centieme de "inch"
            Dim myPaperSize As PaperSize = Me.docToPrint.PrinterSettings.DefaultPageSettings.PaperSize
     
            'calcule  taille en inch(divise par 100 vu que unite=> centieme de inch)
            Dim myPaperSizeReal As Size
            myPaperSizeReal.Width = (myPaperSize.Width / 100)
            myPaperSizeReal.Height = (myPaperSize.Height / 100)
            'affiche  taille en mm pour la "satisfaction"
            Me.textBoxWidthPapier.Text = (myPaperSizeReal.Width * 25.4).ToString
            Me.textBoxHeightPapier.Text = myPaperSizeReal.Height * 25.4.ToString
     
            ' convertit taille papier en pixel
            ' rappel :resolution ecran par default 96 dpi. 
            Dim myPaperSizePixel As Size
            myPaperSizePixel.Width = myPaperSizeReal.Width * 96
            myPaperSizePixel.Height = myPaperSizeReal.Height * 96
     
            'Original Image  stockee sur le picturebox  
            Dim OriginalImage As Image = Me.PictureBox1.Image
     
            'cotes de la grille de decoupage ou "cropping"
            Dim nbSideW As Integer = OriginalImage.Width / myPaperSizePixel.Width
            Dim nbSideH As Integer = OriginalImage.Height / myPaperSizePixel.Height
     
            ListPagesImage = New List(Of Bitmap)
            Dim x1 As Integer = 0
            Dim y1 As Integer = 0
            Dim grCropBitmap As Graphics = Nothing
            For j As Integer = 1 To nbSideH
                For i As Integer = 1 To nbSideW
                    Dim CropRect As Rectangle = New Rectangle(x1, y1, myPaperSizePixel.Width, myPaperSizePixel.Height)
                    Dim CropBitmap As Bitmap = New Bitmap(CropRect.Width, CropRect.Height)
     
                    grCropBitmap = Graphics.FromImage(CropBitmap)
                    grCropBitmap.DrawImage(OriginalImage, New Rectangle(0, 0, CropRect.Width, CropRect.Height), CropRect, GraphicsUnit.Pixel)
                    ListPagesImage.Add(CropBitmap)
                    x1 = x1 + myPaperSizePixel.Width
                Next
                x1 = 0
                y1 = y1 + myPaperSizePixel.Height
            Next
     
            'libere resources
            If grCropBitmap IsNot Nothing Then
                grCropBitmap.Dispose()
     
            End If
            OriginalImage = Nothing
     
            'compute total pages
            totalPages = Me.ListPagesImage.Count - 1
        End Sub
     
     
     
     
     
        Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles docToPrint.PrintPage
            'no pages to print. 
            If totalPages = 0 Then Return
     
            ' Specify units CoordinateSpace.Page in Pixel
            e.Graphics.PageUnit = GraphicsUnit.Pixel
     
            ' Specify PageScale 
            e.Graphics.PageScale = 1.0
            Dim BmpToPrint As Bitmap = Me.ListPagesImage(numPage)
            e.Graphics.DrawImage(BmpToPrint, 0, 0)
            numPage = numPage + 1
     
            ' Test for last page
            e.HasMorePages = (numPage < totalPages)
     
        End Sub
     
        Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click
     
            PrintPreviewDialog1.Document = Me.docToPrint
            PrintPreviewDialog1.Show()
     
        End Sub
     
     
    End Class
    Le 2 exemple code est le 1er legerement modifie pour definir un rectangle de "cropp" en mm converti en inch ensuite en centieme d'inch dans l'event QueryPageSettings -qui est declenche aussi à chaque impression de page-et ensuite transmis à la sub CroppingImageBis qui se charge de le convertir en pixel .
    Un boolean FirstPassage est utilise pour n'appeler la sub charge du cropping qu'une seule fois.....

    exemple code 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
     
    '2 exemple identique au 1er sauf que format papier imprimante est definit lors du passage dans 
    'dans l'event QueryPageSettings lors du 1er passage..... 
    'pour eviter une boucle infinie car l'event querySetting comme l'event PrintPage
    'sont appeles a chaque impression d'une page....
    'un boolean FirstPassage est utilise pour desactiver les appels suivants
    'de CroopImage 
    'AJOUTER LES CONTROLS:
    '-4 TEXTEBOX
    '-1 PRINTDOCUMENT
    '-1 PRINTPREVIEW
    '-1 PICTUREBOX
    '-2 BOUTONS
     
    Imports System.Drawing.Drawing2D
    Imports System.Drawing.Printing
     
    Public Class frmPrintImageCustomSize
     
        'counter:numero de page à imprimer
        Private numPage As Integer = 0
     
        'total pages à imprimer
        Private totalPages As Integer = 0
     
        'liste des sous-images croppees taille reelle
        Private ListPagesImage As List(Of Bitmap)
     
        'dimension "reelles" de l'image en inch
        Private widthOriginalImage As Single
        Private heightOriginalImage As Single
     
        'RAJOUT DU BOOLEAN  FirstPassage
        Private FirstPassage As Boolean
     
        Public Sub New()
     
            ' Cet appel est requis par le Concepteur Windows Form.
            InitializeComponent()
     
            ' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
            ' Pour connaitre la taille reelle d'image "sortie sur papier"
            ' à partir des dimensions (width et height) donnees en pixel d'une image et 
            ' des resolutions Horizontale et Verticale de l'image donnees
            ' en "Pixel /Inch" (Inch =>pouce en francais)
            '
            ' Size.Width(unite inch)=Size.Width(unite pixel)/ResH(unite:pixel/inch)
            '
            ' Dimensions sont converties en mm car un "Inch" vaut 25.4 mm
            ' Formule sera reutilisee en sens "inverse"  lors du "cropping" plus loin.
     
            ' Real Width in inch 
            widthOriginalImage = (Me.PictureBox1.Image.Width / Me.PictureBox1.Image.HorizontalResolution)
            ' Display Real Width in mm 
            Me.textBoxRealWidth.Text = (widthOriginalImage * 25.4).ToString
     
     
            ' Real Width in inch 
            heightOriginalImage = (Me.PictureBox1.Image.Height / Me.PictureBox1.Image.VerticalResolution)
            'Display Real Height in mm pour la "satisfaction"
            Me.textBoxRealHeight.Text = (heightOriginalImage * 25.4).ToString
     
     
     
            'initialise  variables pour l'impression pour gerer plusieurs pages !
            numPage = 0
            ' Image Originale sera "croppee"  en une serie d'image 
            ' dont la taille correspondra à un format A4
            ' sous-images "croppees" à imprimer seront stockees dans ListPagesImage
     
            FirstPassage = False
     
        End Sub
        Private Sub CroopImageBis(ByVal myPaperSize As PaperSize)
     
            ' taille papier est envoye par event querysettins cette fois
            If myPaperSize Is Nothing Then Return
            Dim myPaperSizeReal As PaperSize = myPaperSize
     
     
            'affiche  taille en mm pour la "satisfaction"
            Me.textBoxWidthPapier.Text = (myPaperSizeReal.Width * 25.4).ToString
            Me.textBoxHeightPapier.Text = myPaperSizeReal.Height * 25.4.ToString
     
            ' convertit taille papier en pixel
            ' rappel :resolution ecran par default 96 dpi. 
            Dim myPaperSizePixel As Size
            myPaperSizePixel.Width = myPaperSizeReal.Width * 96
            myPaperSizePixel.Height = myPaperSizeReal.Height * 96
     
            'Original Image  stockee sur le picturebox  
            Dim OriginalImage As Image = Me.PictureBox1.Image
     
            'cotes de la grille de decoupage ou "cropping"
            Dim nbSideW As Integer = OriginalImage.Width / myPaperSizePixel.Width
            Dim nbSideH As Integer = OriginalImage.Height / myPaperSizePixel.Height
     
            ListPagesImage = New List(Of Bitmap)
            Dim x1 As Integer = 0
            Dim y1 As Integer = 0
            Dim grCropBitmap As Graphics = Nothing
            For j As Integer = 1 To nbSideH
                For i As Integer = 1 To nbSideW
                    Dim CropRect As Rectangle = New Rectangle(x1, y1, myPaperSizePixel.Width, myPaperSizePixel.Height)
                    Dim CropBitmap As Bitmap = New Bitmap(CropRect.Width, CropRect.Height)
                    'dessine un sous-bitmap croppe
                    grCropBitmap = Graphics.FromImage(CropBitmap)
                    grCropBitmap.DrawImage(OriginalImage, New Rectangle(0, 0, CropRect.Width, CropRect.Height), CropRect, GraphicsUnit.Pixel)
                    ListPagesImage.Add(CropBitmap)
                    x1 = x1 + myPaperSizePixel.Width
                Next
                x1 = 0
                y1 = y1 + myPaperSizePixel.Height
            Next
            'libere resources
            If grCropBitmap IsNot Nothing Then
                grCropBitmap.Dispose()
     
            End If
            OriginalImage = Nothing
     
            'compute total pages
            totalPages = Me.ListPagesImage.Count - 1
        End Sub
     
     
     
     
     
        Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles docToPrint.PrintPage
            'no pages to print. 
            If totalPages = 0 Then Return
     
            ' Specify units CoordinateSpace.Page in Pixel
            e.Graphics.PageUnit = GraphicsUnit.Pixel
     
            ' Specify PageScale 
            e.Graphics.PageScale = 1.0
            Dim BmpToPrint As Bitmap = Me.ListPagesImage(numPage)
            e.Graphics.DrawImage(BmpToPrint, 0, 0)
            numPage = numPage + 1
     
            ' Test for last page
            e.HasMorePages = (numPage < totalPages)
     
        End Sub
        Private Sub docToPrint_QueryPageSettings(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.QueryPageSettingsEventArgs) Handles docToPrint.QueryPageSettings
     
            'Exemple  papier custom de 150x150 mm
            Dim myPaperSize As PaperSize = New PaperSize
     
            'specifier RawKind=PaperKind.Custom pour taille personnalise
            myPaperSize.RawKind = PaperKind.Custom
     
            'taille en millimetres doit etre converties en inch(divise par 25.4)
            myPaperSize.Width = (150) / 25.4
            'ensuite change  en centieme de inch
            myPaperSize.Width = myPaperSize.Width * 100
     
     
            'Idem hauteur
            myPaperSize.Height = (150) / 25.4
            myPaperSize.Height = myPaperSize.Height * 100
     
            '"Sette" taille papier d'imprimante
            e.PageSettings.PaperSize = myPaperSize
     
            'Affiche taille en "centieme inch"
            Me.textBoxWidthPapier.Text = myPaperSize.Width.ToString
            Me.textBoxHeightPapier.Text = myPaperSize.Height.ToString
     
            'LE FLAG   FirstPassage
            If Not FirstPassage Then
                'reprend papersize en inch pour CroopImageBis pour eviter
                'de nombreuse conversions
                myPaperSize.Width = (150) / 25.4
                myPaperSize.Height = (150) / 25.4
                CroopImageBis(myPaperSize)
                FirstPassage = True
            End If
     
     
        End Sub
        Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click
     
            PrintPreviewDialog1.Document = Me.docToPrint
            PrintPreviewDialog1.Show()
     
        End Sub
     
     
    End Class
    :L
    Le diable est bien dans les conversions d'unites..car l'impression se fait sans mise à l'echelle c.à.d c'est comme Imprimer la Carte Routiere Michelin en une serie d'image A4 en unites "universelles" ou "world".......c.à.d celle de l'utilisateur.
    Si tu fais abstraction de l'echelle tu peux bien sur la cropper directement en une liste d'image et l'imprimer.....
    bon code......................

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 50
    Par défaut
    Merci beaucoup pour ta réponse. Pour l'instant je laisse de côté le découpage de l'image, et je m'intéresse à l'impression de plusieurs pages, chacune contenant une image que je charge directement. Voici mon code (la méthode imprimer() est appelée après clic sur un bouton);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     private void imprimer()
            {
                printPreviewDialog1.Document = printDocument1;
                printPreviewDialog1.ShowDialog();
            }
     
            private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
            {
                Graphics g = Graphics.FromHwnd(this.Handle);
                Image image1 = Image.FromFile(@"C:\Users\Julie\Desktop\image1.png"); 
                Image image2 = Image.FromFile(@"C:\Users\Julie\Desktop\image2.png");
                ImageList MaCollec = new ImageList();
                MaCollec.Images.Add(image1);
                MaCollec.Images.Add(image2);
                int TotalPages = MaCollec.Images.Count;
                for (int NumPage = 0; NumPage < TotalPages; NumPage++) // parcours les images découpées
                {
                    // MaCollec.Draw(g, 0, 0, 150, 150, NumPage);
                    e.HasMorePages = true;
     
                    if (NumPage == TotalPages) {
                        e.HasMorePages = false;
                    }
                }
            }
    Actuellement ce code me génère des pages à imprimer indéfiniement
    Je comprends pas trop comment ça marche l'impression et ce que je suis sencée mettre dans mon parcours d'image (est-ce que je lance un élément graphic qui dessine chaque image ici ou pas??)
    Voilà donc si tu as des précisions à m'apporter ce serait cool pour moi

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 056
    Par défaut
    Je me rappel plus trop, mais il me semble que printDocument1_PrintPage est rappelé à chaque nouvelle page.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                for (int NumPage = 0; NumPage < TotalPages; NumPage++) // parcours les images découpées
                {
                    // MaCollec.Draw(g, 0, 0, 150, 150, NumPage);
                    e.HasMorePages = true;
     
                    if (NumPage == TotalPages) {
                        e.HasMorePages = false;
                    }
                }
    En fait il ne faut pas faire de boucle à l’intérieur mais garder une variable en global qui saura ou tu en es dans tes pages...
    Bon jpeux me tromper j'ai fait ca qu'une fois il y a quelques temps.

  5. #5
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour
    Tu n'as pas repris l'exemple correctement et tu fais des confusions dans GDI
    Il faut relire les tutoriaux de la faq sur GDI(graphics) et l'impression des documents .
    Ce que tu ne comprends pas actuemment c'est que printDocument_PrintPage
    est un evenement declenche par le bouton "imprimer" pour chaque page.
    Cet evenement se repete tant que sa variable e.HasMorePages = true.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    using System;
    using System.Collections.Generic;
    using System.Drawing;
    using System.Windows.Forms;
    using System.Drawing.Printing;
     
    namespace PrintImageSizeRealCSharp
    {
        public partial class Form1 : Form
        {
            // ces variables doivent etre declarees en portee classe.
            ImageList MaCollec;
            int numPage;
            int totalPages ;
     
            public Form1()
            {
                InitializeComponent();
     
            }
     
            private void btnImprimer_Click(object sender, EventArgs e)
            {
               // charge les images
                Image image1 = Image.FromFile(@"C:\Users\Julie\Desktop\image1.png");
                Image image2 = Image.FromFile(@"C:\Users\Julie\Desktop\image2.png");
                // initialise correctemement tes variables globales
                MaCollec = new ImageList();
                MaCollec.Images.Add(image1);
                MaCollec.Images.Add(image2);
                numPage = 0;
                //totalpages comprends le nb image
                totalPages = this.imageList1.Images.Count;
                //lance l'impression
                printPreviewDialog1.Document = printDocument1;
                printPreviewDialog1.ShowDialog();
            }
     
            private void printDocument1_PrintPage(object sender, PrintPageEventArgs e)
            {
     
                Graphics g = e.Graphics ;
                //recupere l'image en cours
                Image imgToPrint = MaCollec.Images[numPage];
                e.Graphics.DrawImage(imgToPrint, 0, 0, 150, 150);
     
                //incremente ton compteur d'image ou page
                numPage = numPage + 1;
     
                e.HasMorePages = true; 
     
                //Test for last image
                if (numPage == totalPages)
                {
                    e.HasMorePages = false;
                }
            }
        }
    }
    bon code...............

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 50
    Par défaut
    Merci beaucoup! J'ai essayer avec ton code Mabrouki, et cela m'affiche bien 2 pages à imprimer avec les images, mais en fait à l'ajout des images dans l'imageList, les images prennent automatiquement une taille de 16x16, et je sais que l'on peut donner une taille standard à la collection d'images, sauf que moi je n'aurai pas forcément la même pour toutes les images...
    De plus, on ne peut pas mettre une taille d'image de plus de 256*256;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MaCollec = new ImageList();
    MaCollec.ImageSize = new Size(256, 256);
    Et même là elles s'affichent en miniscule...
    Sinon j'ai tester ton code pour cropper l'image et cela fonctionne bien, le seul problème vient de cette taille d'images qui ne me permet pas de les afficher correctement...
    Après renseignement, il semblerait que je n'ai pas le choix et que l'utilisation de l'imageList n'est pas approprié pour mon cas... Y aurait-il une autre solution, sans passer par l'enregistrement des images dans un dossier?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Imprimer une Image sur plusieurs pages
    Par bahmani dans le forum Débuter
    Réponses: 1
    Dernier message: 15/04/2009, 13h45
  2. Tableaux d'images sur plusieurs pages
    Par GDMINFO dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 1
    Dernier message: 07/01/2008, 16h22
  3. imprimer une diapositive sur plusieurs page
    Par Flow_75 dans le forum Powerpoint
    Réponses: 1
    Dernier message: 15/07/2007, 03h21
  4. Imprimer un Jpanel sur plusieurs pages.
    Par Amrac dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 11/03/2007, 15h19
  5. [Swing] Imprimer des JeditorPane sur plusieurs pages ?
    Par bilou_lelapinou dans le forum AWT/Swing
    Réponses: 22
    Dernier message: 29/11/2006, 22h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo