none
Impression d'un morceau d'image RRS feed

  • Question

  • Bonjour

    J'ai écrit un programme qui permet de visualiser une carte, d'effectuer un zoom et de me déplacer sur cette carte. J'en suis arrivé à la phase d'impression. Pour la taille normale, il n'ya pas de problème mais quand il s'agit d'imprimer le morceau de carte affiché à l'écran, ça ne marche pas. J'ai essayé la plupart des exemples donnés par l'aide en ligne mais je n'y arrive pas.

    Merci d'avance.

    lundi 2 juin 2014 12:15

Réponses

  • J'ai enfin trouvé d'où proviennent mes problèmes !

    J'utilise la routine suivante :

    Private Sub pdtMain_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pdtMain.PrintPage
            With Me
                ' ***********************
                ' * Création de l'image *
                ' ***********************
                Dim newImage As Image = Image.FromFile(NomFic)
                ' ***************************************************************
                ' * Création du rectangle pour l'affichage de l'image originale *
                ' ***************************************************************
                Dim Units As GraphicsUnit = GraphicsUnit.Pixel
                Select Case .tkrZoom.Value
                    Case Is = 0
                        ' **********************************
                        ' * Affichage de l'image originale *
                        ' **********************************
                        Dim DestRect1 As New Rectangle(OrigGauche, OrigHaut, OrigLargeur, OrigHauteur)
                        e.Graphics.DrawRectangle(Pens.Red, DestRect1)
                        e.Graphics.DrawImage(newImage, DestRect1)
                    Case Is > 0
                        ' ***********************************
                        ' * Création de la méthode CallBack *
                        ' ***********************************
                        Dim ImageCallBack As New Graphics.DrawImageAbort(AddressOf DrawImageCallback8)
                        Dim ImageCallBackData As New IntPtr(1)
                        ' ********************************************************************
                        ' * Création des attributs de l'image et définition d'un grand Gamma *
                        ' ********************************************************************
                        Dim imageAttr As New ImageAttributes
                        imageAttr.SetGamma(2.0F)
                        ' **********************************************
                        ' * Création du rectangle de sélection de zone *
                        ' **********************************************
                        Dim DestRect2 As New Rectangle(OrigGauche, OrigHaut, OrigLargeur, OrigHauteur)
                        e.Graphics.DrawRectangle(Pens.Green, DestRect2)
                        ' *******************************
                        ' * Dessin de l'image retaillée *
                        ' *******************************
                        Try
                            e.Graphics.DrawImage(newImage, DestRect2, Carte(3), Carte(4), OrigLargeur, OrigHauteur, Units, imageAttr)
                        Catch ex As Exception
                            e.Graphics.DrawString(ex.ToString(), New Font("Arial", 8), Brushes.Black, New PointF(0, 0))
                        End Try
                End Select
            End With
        End Sub

    Tous mes problèmes proviennent des calculs des coordonnées de l'image. C'est à dire de Carte(1), Carte(2), OrigLargeur et OrigHauteur. J'ai résolu le problème de la largeur et de la hauteur et je ne suis pas loin de résoudre ceux des origines Left(Carte(1)) et Top(Carte(2)).

    C'est ce qui s'appelle se noyer dans un verre d'eau ! Je m'excuse de vous avoir dérangé pour un problème aussi simple (quand il est résolu) !!!!

    Cordialement.

    • Marqué comme réponse Aurel Bera mercredi 11 juin 2014 13:40
    mercredi 11 juin 2014 13:32
  • Merci de votre retour!

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mercredi 11 juin 2014 13:40

Toutes les réponses

  • Bonjour

    Comment vous affichez l'image?
    Le plus simple sera de créer un autre objet Image en mémoire avec le morceau que vous intéresse et l'imprimer.
    Ici vous avez un petit exemple :

    How to crop an image in vb.net 

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 3 juin 2014 08:28
  • Je n'est pas été bien clair dans ma description.

    J'utilise un fond de feuille avec un TableLayoutPanel à 4 cases. La case en haut à gauche me sers à contenir un Panel dans lequel j'ai dessiné un PictureBox. C'est ce PictureBox qui me sers à afficher ma carte. Lorsque je modifie les paramètres d'affichage (Zoom + ou -), c'est ce panel qui affiche le morceau de carte. C'est donc la surface de ce panel contenant le morceau agrandit de la carte que je voudrais imprimer.

    Je précise que je voudrais utiliser cette fonction de deux façons : soit un aperçu avant impression, soit une impression directe.

    J'ai consulté l'exemple que vous m'avez indiqué et je vais tenter de l'adapter.

    Cordialement.

    mardi 3 juin 2014 12:11
  • Bonjour

    Avez-vous des nouvelles pour nous?

    Merci!

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    vendredi 6 juin 2014 09:49
  • Et bien non, je n'arrive pas à comprendre le fonctionnement de l'instruction

    e.graphics.drawrectangle(NewImage,DestRect2,X,Y,width,height)

    Cordialement

    vendredi 6 juin 2014 12:06
  • drawrectangle - désigne un rectangle.
    Le plus probable vous devez utiliser DrawImage qui copie une section d'une image dans un autre objet de type image.

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    vendredi 6 juin 2014 12:26
  • D'après ce que j'ai pu comprendre dans les exemples que j'ai testé, DrawRectangle (DestRect2)est utilisé pour définir la zone dans laquelle va se positionner l'image (NewImage). Ca, j'arrive à le faire pour l'image normale.

    De ce que j'ai pu comprendre, les coordonnées X, Y, width et height détermine la taille du morceau d'image à positionner dans le rectangle DestRect2. Et c'est là que n'arrive pas à dimensionner correctement ces X, Y, width et height.

    Pour information, je vous donne la routine d'agrandissement de mon image :

    Private

    Sub tkrCarte_Scroll(ByVal sender As System.Object, ByVal e As System.EventArgs)Handles tkrZoom.Scroll

       With Me

        Hauteur = .imgCarte.Height

        Largeur = .imgCarte.Width

        Gauche = .imgCarte.Left

        Haut = .imgCarte.Top

        Valeur = .tkrZoom.Value

        Sens = Valeur - Orig

        Select Case Sens

          Case Is > 0

            With .imgCarte

            .Width = Largeur * 1.2

            .Height = .Width / Sqrt(2)

            .Left = Gauche - ((.Width - Largeur) / 2)

            .Top = Haut - ((.Height - Hauteur) / 2)

          End With

          X1 = Largeur * 0.8333333333

          Y1 = X1 / Sqrt(2)

          X0 = ((Largeur - X1) / 2)

          Y0 = ((Hauteur - Y1) / 2)

        Case Is < 0

          With .imgCarte

            .Width = Largeur * 0.8333333333

            .Height = .Width / Sqrt(2)

            .Left = Gauche + ((Largeur - .Width) / 2)

            .Top = Haut + ((Hauteur - .Height) / 2)

          End With

          X1 = Largeur * 1.2

          Y1 = X1 / Sqrt(2)

          X0 = ((X1 - Largeur) / 2)

          Y0 = ((Y0 - Hauteur) / 2)

        End Select

        .psbZoom.Value = .tkrZoom.Value

        .lblZoom.Text = 

    String.Format("Zoom = {0}", Valeur)

        Orig = .tkrZoom.Value

      End With

    End Sub

    vendredi 6 juin 2014 15:27
  • Bonjour

    Pouvez-vous nous créer un petit projet de teste?

    Bien cordialement,



    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.



    mardi 10 juin 2014 08:18
  • Qu'est-ce que vous appelez un petit projet de test ?

    Je vous ai décris la partie principale de mon programme qui est le changmeent de dimension de ma carte dans sa fenêtre d'affichage. Les autres procédures concernent le déplacement de l'image dans sa fenêtre.

    Je vous remercie d'éclaircir votre demande.

    Cordiaement

    mardi 10 juin 2014 11:51
  • Un projet avec une forme qui contient un contrôle pour afficher une image de teste (incluse dans le projet), et avec le contrôle dont le traitement des évènements vous pose des problèmes.
    Si on voit le comportement, on aura des indices sur la source du problème.

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mardi 10 juin 2014 12:06
  • J'ai enfin trouvé d'où proviennent mes problèmes !

    J'utilise la routine suivante :

    Private Sub pdtMain_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pdtMain.PrintPage
            With Me
                ' ***********************
                ' * Création de l'image *
                ' ***********************
                Dim newImage As Image = Image.FromFile(NomFic)
                ' ***************************************************************
                ' * Création du rectangle pour l'affichage de l'image originale *
                ' ***************************************************************
                Dim Units As GraphicsUnit = GraphicsUnit.Pixel
                Select Case .tkrZoom.Value
                    Case Is = 0
                        ' **********************************
                        ' * Affichage de l'image originale *
                        ' **********************************
                        Dim DestRect1 As New Rectangle(OrigGauche, OrigHaut, OrigLargeur, OrigHauteur)
                        e.Graphics.DrawRectangle(Pens.Red, DestRect1)
                        e.Graphics.DrawImage(newImage, DestRect1)
                    Case Is > 0
                        ' ***********************************
                        ' * Création de la méthode CallBack *
                        ' ***********************************
                        Dim ImageCallBack As New Graphics.DrawImageAbort(AddressOf DrawImageCallback8)
                        Dim ImageCallBackData As New IntPtr(1)
                        ' ********************************************************************
                        ' * Création des attributs de l'image et définition d'un grand Gamma *
                        ' ********************************************************************
                        Dim imageAttr As New ImageAttributes
                        imageAttr.SetGamma(2.0F)
                        ' **********************************************
                        ' * Création du rectangle de sélection de zone *
                        ' **********************************************
                        Dim DestRect2 As New Rectangle(OrigGauche, OrigHaut, OrigLargeur, OrigHauteur)
                        e.Graphics.DrawRectangle(Pens.Green, DestRect2)
                        ' *******************************
                        ' * Dessin de l'image retaillée *
                        ' *******************************
                        Try
                            e.Graphics.DrawImage(newImage, DestRect2, Carte(3), Carte(4), OrigLargeur, OrigHauteur, Units, imageAttr)
                        Catch ex As Exception
                            e.Graphics.DrawString(ex.ToString(), New Font("Arial", 8), Brushes.Black, New PointF(0, 0))
                        End Try
                End Select
            End With
        End Sub

    Tous mes problèmes proviennent des calculs des coordonnées de l'image. C'est à dire de Carte(1), Carte(2), OrigLargeur et OrigHauteur. J'ai résolu le problème de la largeur et de la hauteur et je ne suis pas loin de résoudre ceux des origines Left(Carte(1)) et Top(Carte(2)).

    C'est ce qui s'appelle se noyer dans un verre d'eau ! Je m'excuse de vous avoir dérangé pour un problème aussi simple (quand il est résolu) !!!!

    Cordialement.

    • Marqué comme réponse Aurel Bera mercredi 11 juin 2014 13:40
    mercredi 11 juin 2014 13:32
  • Merci de votre retour!

    Bien cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    mercredi 11 juin 2014 13:40