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

C# Discussion :

Copier une partie d'une bitmap


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut Copier une partie d'une bitmap
    Bonjour,
    je cherche a récupérer une partie d'image sélectionné par la souris dans une pictureBox.
    Sur le MDSN il y a une fonction qui semble être toute prête mais je n'arrive pas.
    La sélection se fait bien mais au lieux de récupérer une partie de l'image je redimensionne l'image entière aux valeurs du rectangle de sélection.
    Je suis débutant merci pour votre aide et vos explications


    La fonction prise sur le Mdsn:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            // Copies a part of a bitmap.
            protected Bitmap CopyBitmap(Bitmap source, Rectangle part)
            {
                Bitmap bmp = new Bitmap(part.Width, part.Height);
                Graphics g = Graphics.FromImage(bmp);
                g.DrawImage(source, 0, 0, part, GraphicsUnit.Pixel);
                g.Dispose();
                return bmp;
            }
    le code de pictureBox1_MouseUp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                pic1 = pictureBox1.Image; //image de la pictureBox 
                Pic2 = new Bitmap(pic1, _selection.Width, _selection.Height); 
                Rectangle srcRect = new Rectangle(0, 0, _selection.Width, _selection.Height);
                CopyBitmap(Pic2, srcRect);
                pictureBox1.Image = CopyBitmap(Pic2, srcRect);

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 39
    Points : 31
    Points
    31
    Par défaut
    Bonjour,

    utilise la fonction clone de la classe Bitmap

    http://msdn.microsoft.com/fr-fr/library/ms141944.aspx

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Bonjour,
    merci pour la réponse mais après quelques heures de test, même avec la fonction clone ça fonctionne pas.
    Je ne comprend pas cette fonction la seule chose que j'arrive à faire c'est de redimensionner l'image .
    Je suis novice en prog et une petite explication ou exemple serait le bien venue.
    merci,
    @++

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Bon y a du mieux
    mais c'est lent le premier coup !?
    le code suivant sélectionne une partie de picture.box1 et le clone sur la pictureBox.2 mais avec lenteur à la première sélection puis après c'est bon.
    Dans le paint de la picBox2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
                if (cloneBitmap != null)
                {
                    e.Graphics.DrawImage(cloneBitmap, 0, 0);
                    pictureBox2.Refresh();
                }
    puis dans le pictureBox1_MouseUp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
                _selecting = false;
                Bitmap myBitmap = new Bitmap(pictureBox1.Image);
                Rectangle cloneRect = _selection;
                System.Drawing.Imaging.PixelFormat format = myBitmap.PixelFormat;
                cloneBitmap = myBitmap.Clone(cloneRect, format);
                pictureBox2.Refresh();

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 254
    Points : 55
    Points
    55
    Par défaut
    Re-Bonjour,
    Clone ou autre j'ai toujours le même problème, si la Bitmap source où je fais la sélection est supérieure en taille à la bitmap l'image créer ne correspond pas à celle sélectionné, seule la taille est correcte.
    exemple
    Dans une pictureBox de 800*600 j'affiche une image qui fait 2500*2000(taille réelle), si je sélectionne avec la souris une partie (ex100*150) dans cette pictureBox et que je clone l'image sélectionnée, la nouvelle image correspondra a 100*150 de l'image réelle et non pas de la pictureBox .
    Si je redimensionne l'image d'origine pour ensuite zoomer une partie je perd toute la qualité d'image.
    Le but est de zoomer l'image réelle à un emplacement sélectionné par la souris.
    Merci pour votre aide

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 442
    Points
    4 442
    Par défaut PICTUREBOX AVEC ZOOM ET SCROLLBARS
    BONJOUR LOLO
    D'abord si tu copies une zone de bitmap de taille superieure au picturebox de destination il faut avoir dans celui:
    -propriete sizemode à autosize ensuite l'effet est desagreable parce le picturebox va essayer de s'agrandir.
    -a moins que tu joues sur la resolution (setResolution) voici ce que fais GDI en coulisse quand tu charge une image:
    GDI+ automatiquement calcule la taille d'affichage de l' image sur ecran en se basant sur taille image, resolution image, et resolution d'ecran . Par defaut tu as :

    Image Width/Actual Image Width = Display Resolution/Image Resolution

    Image Height/Actual Image Height = Display Resolution/Image Resolution
    voici un extrait de code qui change la taille eventuellement pour l'adapter a la destination:
    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
     
     
    private void Form1_Paint(object sender,
        System.Windows.Forms.PaintEventArgs e)
    {
        Graphics g = e.Graphics;
        Bitmap bmp = new Bitmap("rama.jpg");
        g.DrawImage(bmp, 0, 0);
     
        Console.WriteLine("Screen resolution: " + g.DpiX + "DPI");
        Console.WriteLine("Image resolution: " +
                                bmp.HorizontalResolution + "DPI");
        Console.WriteLine("Image Width: " + bmp.Width); 
        Console.WriteLine("Image Height: " + bmp.Height);
     
        SizeF s = new SizeF(bmp.Width*(g.DpiX/bmp.HorizontalResolution),
                            bmp.Height*(g.DpiY/bmp.VerticalResolution));
        Console.WriteLine("Display size of image: " + s);
    }
    maintenant ,parbleu la boite à outils mais elle faite pour ca ,je te refile ci-apres un code en vb.net pour zoomer dans un picturebox dote en plus de scrollbar c'est tres simple vois-tu et ce n'est pas insurmontable :

    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
     
    'Projet PictureBox avec Zoom et Scrollbars
    'Ajouter 
    '-un TableLayoutPanel
    'mettre dans le TableLayoutPanel
    '-un TextBox dans ligne=1,col=1 du TableLayoutPanel
    '-un bouton ActionneAffichage dans ligne=2,col=1 du TableLayoutPanel
    '-un trckAfficheEchelle dans ligne=3,col=1 et 2 du TableLayoutPanel(columnspan=2)
    '-un Panel dans ligne=1 et 2(rowspan=2) ,col=2 du TableLayoutPanel(columnspan=2)
    '-un PictureBox picAireDessin dans le Panel
    'commentaires :
    'Le TrackerBar gere le zoom dans le picturebox
    'Le Panel qui est dans le TableLayoutPanel contient lui meme le pictureBox
    'Il sert a jouter les scrollbars au picturebox qui ne dispose pas de cette propriete.
    'Le bouton ActionneAffichage sert à rafraichir le PictureBox à chaque Zoom
    'Ifaut ajouter dans cette exemple un repertoire resources avec une image nb.jpeg 
    Public Class Form1
     
        Dim nouvelleImage As Image
        Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            'Init TableLayoutPanel
            Me.TableLayoutPanel1.RowCount = 3
            Me.TableLayoutPanel1.ColumnCount = 2
            Me.Panel1.Dock = DockStyle.Fill
     
            'Init Panel
            Me.Panel1.Dock = DockStyle.Fill
            Me.Panel1.AutoScroll = True 'Active Scrolling 
            Me.Panel1.AutoScrollMinSize = New Size(600, 400) 'Si inferieur a cette taille faire apparaitr les scrollbars        'Init picture box
            picAireDessin.BackColor = Color.White
            picAireDessin.BorderStyle = BorderStyle.Fixed3D
            picAireDessin.Dock = DockStyle.Fill
            'Init TrackerBar
            trckAfficheEchelle.Value = 1 'valeur initiale
            trckAfficheEchelle.Minimum = 1 'valeur mini pour zoom
            trckAfficheEchelle.Maximum = 100 'valeur maxi pour zoom
            trckAfficheEchelle.LargeChange = 5 'pas de zoom
            'Charge l'image du dossier Resources(nb4 est une image jpeg Michelin)
            nouvelleImage = My.Resources.nb4
        End Sub
     
        Private Sub ActionneAffichage_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ActionneAffichage.Click
            ' ----- Force le reaffichage du texte et de l'image.
            picAireDessin.Invalidate()
        End Sub
     
        'Private Sub DrawingArea_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles DrawingArea.Paint
        '    ' ----- Refresh the drawing area. 
        '    '
        '    Dim titleFont As Font
        '    Dim mainFont As Font
        '    Dim titleArea As Rectangle
        '    Dim textArea As Rectangle
        '    Dim titleFormat As StringFormat
        '    Const MainTitle As String = "Important Message"
     
        '    ' ----- Clear any existing content.
        '    e.Graphics.Clear(Color.White)
     
        '    ' ----- Build some fonts used for the display text.
        '    titleFont = New Font("Arial", 16, FontStyle.Bold)
        '    mainFont = New Font("Arial", 12, FontStyle.Regular)
     
        '    ' ----- Determine where the title and main text will go.
        '    titleArea = New Rectangle(0, 0, _
        '       DrawingArea.ClientRectangle.Width, titleFont.Height)
        '    textArea = New Rectangle(0, titleFont.Height * 1.4, _
        '       DrawingArea.ClientRectangle.Width, _
        '       DrawingArea.ClientRectangle.Height - _
        '       (titleFont.Height * 1.4))
     
        '    ' ----- Scale according to the user's request.
        '    e.Graphics.ScaleTransform(DisplayScale.Value, _
        '           DisplayScale.Value)
     
        '    ' ----- Add a title to the content.
        '    titleFormat = New StringFormat()
        '    titleFormat.Alignment = StringAlignment.Center
        '    e.Graphics.DrawString(MainTitle, titleFont, _
        '       Brushes.Black, titleArea, titleFormat)
        '    titleFormat.Dispose()
     
        '    ' ----- Draw a nice dividing line.
        '    e.Graphics.DrawLine(Pens.Black, 20, _
        '       CInt(titleFont.Height * 1.2), _
        '       DrawingArea.ClientRectangle.Width - 20, _
        '       CInt(titleFont.Height * 1.2))
     
        '    ' ----- Draw the main text.
        '    e.Graphics.DrawString(DisplayText.Text, mainFont, _
        '       Brushes.Black, textArea)
     
        '    ' ----- Clean up.
        '    mainFont.Dispose()
        '    titleFont.Dispose()
     
        'End Sub
        Private Sub DrawingArea_Paint(ByVal sender As Object, ByVal e As System.Windows.Forms.PaintEventArgs) Handles picAireDessin.Paint
            ' ----- Rafraichit la zone de dessin. 
            '
            Dim titreFont As Font
            Dim principalFont As Font
            Dim titreZone As Rectangle
            Dim texteZone As Rectangle
            Dim titreFormat As StringFormat
            Const titrePrincipal As String = "Message Important Mabrouki..."
     
            ' ----- Efface Tout dans le PictureBox.
            e.Graphics.Clear(Color.White)
     
            ' ----- Prepare les fontes utilisees.
            titreFont = New Font("Arial", 18, FontStyle.Bold)
            principalFont = New Font("Arial", 18, FontStyle.Regular)
     
            ' ----- Positionne la Zone du Titre et le texte du Titre.
            titreZone = New Rectangle(0, 0, _
               picAireDessin.ClientRectangle.Width, titreFont.Height)
            texteZone = New Rectangle(0, titreFont.Height * 1.4, _
               picAireDessin.ClientRectangle.Width, _
               picAireDessin.ClientRectangle.Height - _
               (titreFont.Height * 1.4))
     
            ' ----- Met a l'echelle suivant requete Utilisateur(facteur DisplayScale).
            e.Graphics.ScaleTransform(trckAfficheEchelle.Value, _
                   trckAfficheEchelle.Value)
     
            ' ----- Recharge l'image
            e.Graphics.DrawImage(nouvelleImage, 0, 0)
            ' ----- Ajoute un Titre au contenu image.
            titreFormat = New StringFormat()
            titreFormat.Alignment = StringAlignment.Center
            e.Graphics.DrawString(titrePrincipal, titreFont, _
               Brushes.Black, titreZone, titreFormat)
            titreFormat.Dispose()
            ' ----- Dessine le texte entre dans TextBox.
            e.Graphics.DrawString(txtAffiche.Text, principalFont, _
               Brushes.Blue, texteZone)
            ' ----- Liberes ressources GDI.
            principalFont.Dispose()
            titreFont.Dispose()
     
        End Sub
     
     
    End Class
    Facile à transcrire en c#,en plus on peut le faire dans le train pour ne pas s'ennuyer.
    bonne soiree...
    il n'y a que ceux sont vigilants et veillent pour le faire....

Discussions similaires

  1. Copier une partie d'une form dans une image
    Par Duan dans le forum Débuter
    Réponses: 5
    Dernier message: 11/05/2009, 16h16
  2. Sélectionner seulement une partie d'une valeur d'une cellule
    Par ArthurO0O dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2007, 11h05
  3. masquer une partie d'une vidéo par une banniere
    Par lezabour dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2006, 16h47
  4. Réponses: 2
    Dernier message: 02/06/2006, 11h26
  5. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 13h39

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