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

VB.NET Discussion :

Clone d'une partie d'image dans un picturebox a partir du positionnement effectué par l'utilisateur


Sujet :

VB.NET

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 8
    Points
    8
    Par défaut Clone d'une partie d'image dans un picturebox a partir du positionnement effectué par l'utilisateur
    bonjour,

    l'idée est de permettre à un utilisateur
    1) de choisir une image dans sa bibliothèque et de l'afficher dans un picturebox
    2) de choisir une partie de l'image avec son curseur
    3) de lui indiquer la partie sélectionnée avec un rectangle en pointillé.
    4) de cloner cette partie sélectionnée et de la mettre dans un deuxième picturebox pour sauvegarde

    après près de trois semaines de test , recherche et essai j'arrive a résoudre les trois premières parties.

    mais la quatrième donne une image complétement décalée par rapport au cadre sélectionné.

    et la je sèche lamentablement.

    si quelqu'un peut me donner une explication, elle sera la bienvenue.

    voila le code en cause:

    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
        Private Sub PictureBox2_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox2.MouseDown
            souris_deb_X = e.X
            souris_deb_y = e.Y
            PictureBox2.Refresh()
        End Sub
        Private Sub PictureBox2_MouseUp(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox2.MouseUp
            souris_fin_X = e.X
            souris_fin_Y = e.Y
            If souris_fin_X - souris_deb_X = 0 Then Exit Sub
            Dim newImage = New Bitmap(PictureBox2.Image)
            ' entourer la partie selectionnee par user
            Dim g As Graphics = PictureBox2.CreateGraphics()
            Dim RecCoul As Pen = New Pen(Color.Blue, 2)
            Dim Rectsource As New Rectangle(souris_deb_X, souris_deb_y, souris_fin_X - souris_deb_X, souris_fin_Y - souris_deb_y)
            RecCoul.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot
            g.DrawRectangle(RecCoul, Rectsource)
            Dim RectsourceNEW As New Rectangle(souris_deb_X, souris_deb_y, PictureBox1.Width, PictureBox1.Height)
            'rectangle apparait comme demandé par user
            ' Clone de la partie correspondant au rectangle
            Dim NewImage2 = newImage.Clone(RectsourceNEW, newImage.PixelFormat)
            newImage.Dispose()
            Dim FicSor = Application.StartupPath & "\Temp1.jpg"
            PictureBox1.Image = NewImage2
            PictureBox1.Image.Save(FicSor)
            PictureBox1.SizeMode = PictureBoxSizeMode.Zoom
            PictureBox1.Visible = True
        End Sub
    merci d'avance

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Jamais fait ça...

    Chalenge accepted !
    Kropernic

  3. #3
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut Chalenge completed
    Hello,

    Alors pour tester, j'ai pris un nouveau projet winforms dans lequel j'ai un formulaire Form1 sur lequel j'ai juste mis un bouton nommé Button1 et deux pictureBox nommées pbSource et pbClone qui recevront respectivement l'image source et l'image clone.

    Une fois que t'as ce formulaire, voici tout le 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Public Class Form1
        Dim mouse_start_x, mouse_start_y, mouse_end_x, mouse_end_y As Integer
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim ofd As New OpenFileDialog
     
            If ofd.ShowDialog = DialogResult.OK Then
                pbSource.Image = Image.FromFile(ofd.FileName)
            End If
     
        End Sub
     
        Private Sub pbSource_MouseDown(sender As Object, e As MouseEventArgs) Handles pbSource.MouseDown
            mouse_start_x = e.X
            mouse_start_y = e.Y
            pbSource.Refresh()
        End Sub
     
        Private Sub pbSource_MouseUp(sender As Object, e As MouseEventArgs) Handles pbSource.MouseUp
            mouse_end_x = e.X
            mouse_end_y = e.Y
     
            If mouse_end_x - mouse_start_x = 0 Then
                Exit Sub
            End If
     
            Dim g As Graphics = pbSource.CreateGraphics
            g.DrawRectangle(New Pen(Color.Blue, 1), New Rectangle(mouse_start_x, mouse_start_y, mouse_end_x - mouse_start_x, mouse_end_y - mouse_start_y))
     
            Dim clone As Bitmap = New Bitmap(pbSource.Image).Clone(New Rectangle(mouse_start_x, mouse_start_y, mouse_end_x - mouse_start_x, mouse_end_y - mouse_start_y), pbSource.Image.PixelFormat)
     
            pbClone.Image = clone
        End Sub
    End Class
    C'est sensiblement le même que toi vu que je m'en suis inspiré. Je crois que ton problème se situe au niveau des rectangles. Je te laisse comparer
    Kropernic

  4. #4
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Jamais fait ça...

    Chalenge accepted !
    Salut Kropernic,

    C'est pas un challenge, il suffit simplement de le mettre sur la voie.

    @OP :

    Dans un 1er tps ton raisonnement ne colle pas du tout avec ce que tu as écrits comme code !

    ---> Tu as 2 pictureBox : soit PictureBox1 et PictureBox2 : hors dans ton code tu sembles travailler à l'envers. Je peux concevoir qu'il s'agit de tests mais pour une question de logique il faudrait envisager de mettre l'image sélectionné dans PictureBox1 et celle modifiée dans PictureBox2. De plus travailler avec des noms qui respectent à minima la politique de nommage des contrôles aide grandement à la relecture d'un code source à savoir : PcbOriginal et PcbCropped.

    ---> Il faut également faire attention lorsque tu enregistres une image, il faut s'assurer que le mimeType (ou ImageFormat) corresponds bien à l'extension du fichier enregistré. Ce qui n'est pas le cas ici :


    1- Tu instancies une image de type Bitmap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim newImage = New Bitmap(PictureBox2.Image)
    Ok il s'agit d'une instance Bitmap, pas de soucis ! (Tu pourras convertir le format depuis la méthode .Save plus tard au moyen du paramètre ImageFormat)
    2- Tu choisies une mauvaise extension jpg (car ton imageFormat n'est pas bon !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim FicSor = Application.StartupPath & "\Temp1.jpg"
    Tu dois mettre l'extension jpg (si ton imageFormat ci-dessous est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Imaging.ImageFormat.Jpeg
    3- Tu enregistres finalement sans mimetype (ou format d'image), ce qui revient à dire que tu enregistres au format Bmp selon l'instanciation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PictureBox2.Image.Save(FicSor)
    Si tu as choisis l'extension jpg alors la valeur du 2ème argument dans la signature de la méthode .Save doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Imaging.ImageFormat.Jpeg
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PictureBox2.Image.Save(FicSor,Imaging.ImageFormat.Jpeg)

    Voilà pour un début, même si cela ne résoudra pas ton problème lié à ta zone de sélection !

    ++

  5. #5
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    Salut Kropernic,

    C'est pas un challenge, il suffit simplement de le mettre sur la voie.
    C'est une expression et une référence à une série TV à succès (tout est relatif) qui s'est achevée l'année passée (j'espère ne pas me tromper pour l'année car je n'ai pas trop la notion du temps).

    Tout ça pour dire que ça indiquait que je regardais à son problème et que je reviendrais avec de l'aide.
    Kropernic

  6. #6
    Membre régulier
    Homme Profil pro
    Scientist
    Inscrit en
    Mai 2013
    Messages
    110
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Scientist
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2013
    Messages : 110
    Points : 87
    Points
    87
    Par défaut Cropping picture with vbnet
    Bonjour,

    Si je comprend bien, il suffit de chercher sur Google avec le mot cle: "cropping picture with vbnet", et on a les resultats suivant (avec des exemples a charger). Je pense que cela devrait correspondre a ce que vous recherchez.

    http://www.dotnetheaven.com/article/...e-using-vb.net

    http://www.vb-helper.com/howto_2005_crop_picture.html

    Deux exemples parmi d'autres a tester.

    A+
    JLuc01

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par wallace1 Voir le message
    Salut Kropernic,

    C'est pas un challenge, il suffit simplement de le mettre sur la voie.

    @OP :

    Dans un 1er tps ton raisonnement ne colle pas du tout avec ce que tu as écrits comme code !

    ---> Tu as 2 pictureBox : soit PictureBox1 et PictureBox2 : hors dans ton code tu sembles travailler à l'envers. Je peux concevoir qu'il s'agit de tests mais pour une question de logique il faudrait envisager de mettre l'image sélectionné dans PictureBox1 et celle modifiée dans PictureBox2. De plus travailler avec des noms qui respectent à minima la politique de nommage des contrôles aide grandement à la relecture d'un code source à savoir : PcbOriginal et PcbCropped.

    ---> Il faut également faire attention lorsque tu enregistres une image, il faut s'assurer que le mimeType (ou ImageFormat) corresponds bien à l'extension du fichier enregistré. Ce qui n'est pas le cas ici :


    1- Tu instancies une image de type Bitmap :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim newImage = New Bitmap(PictureBox2.Image)
    Ok il s'agit d'une instance Bitmap, pas de soucis ! (Tu pourras convertir le format depuis la méthode .Save plus tard au moyen du paramètre ImageFormat)
    2- Tu choisies une mauvaise extension jpg (car ton imageFormat n'est pas bon !) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim FicSor = Application.StartupPath & "\Temp1.jpg"
    Tu dois mettre l'extension jpg (si ton imageFormat ci-dessous est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Imaging.ImageFormat.Jpeg
    3- Tu enregistres finalement sans mimetype (ou format d'image), ce qui revient à dire que tu enregistres au format Bmp selon l'instanciation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PictureBox2.Image.Save(FicSor)
    Si tu as choisis l'extension jpg alors la valeur du 2ème argument dans la signature de la méthode .Save doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Imaging.ImageFormat.Jpeg
    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PictureBox2.Image.Save(FicSor,Imaging.ImageFormat.Jpeg)

    Voilà pour un début, même si cela ne résoudra pas ton problème lié à ta zone de sélection !

    ++
    Bonjour Wallace1

    j'accepte tes critiques tout à fait justifiées quant à la logique d'attribution des noms de picturebox et l'utilisation du format jpeg.

    merci pour tes conseils.

    bonne journée

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par Kropernic Voir le message
    Hello,

    Alors pour tester, j'ai pris un nouveau projet winforms dans lequel j'ai un formulaire Form1 sur lequel j'ai juste mis un bouton nommé Button1 et deux pictureBox nommées pbSource et pbClone qui recevront respectivement l'image source et l'image clone.

    Une fois que t'as ce formulaire, voici tout le 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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    Public Class Form1
        Dim mouse_start_x, mouse_start_y, mouse_end_x, mouse_end_y As Integer
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim ofd As New OpenFileDialog
     
            If ofd.ShowDialog = DialogResult.OK Then
                pbSource.Image = Image.FromFile(ofd.FileName)
            End If
     
        End Sub
     
        Private Sub pbSource_MouseDown(sender As Object, e As MouseEventArgs) Handles pbSource.MouseDown
            mouse_start_x = e.X
            mouse_start_y = e.Y
            pbSource.Refresh()
        End Sub
     
        Private Sub pbSource_MouseUp(sender As Object, e As MouseEventArgs) Handles pbSource.MouseUp
            mouse_end_x = e.X
            mouse_end_y = e.Y
     
            If mouse_end_x - mouse_start_x = 0 Then
                Exit Sub
            End If
     
            Dim g As Graphics = pbSource.CreateGraphics
            g.DrawRectangle(New Pen(Color.Blue, 1), New Rectangle(mouse_start_x, mouse_start_y, mouse_end_x - mouse_start_x, mouse_end_y - mouse_start_y))
     
            Dim clone As Bitmap = New Bitmap(pbSource.Image).Clone(New Rectangle(mouse_start_x, mouse_start_y, mouse_end_x - mouse_start_x, mouse_end_y - mouse_start_y), pbSource.Image.PixelFormat)
     
            pbClone.Image = clone
        End Sub
    End Class
    C'est sensiblement le même que toi vu que je m'en suis inspiré. Je crois que ton problème se situe au niveau des rectangles. Je te laisse comparer

    Bonjour Kropernic

    ta réponse m'a intéressè au plus haut point et je me suis empressé de la tester.

    au premier essai, j'ai eu la chance de prendre une image petite qui rentrait entièrement dans le picturebox et ça a marché. bravo!!

    j'ai continué avec d'autres images plus importantes et qui ne tenaient pas dans le picturebox.

    j'ai rajouté le PictureBoxSizeMode.Zoom et là catastrophe, je me suis à nouveau retrouvé en décalage.

    en reflechissant, j'ai eu l'idée de passer le fichier de l'utilisateur dans un module ResizeImage (on en trouve pas mal sur le web ) qui retaille l'image en fonction du picturebox.

    et là miracle TA SOLUTION MARCHE dans tous les cas.

    alors, bravo et surtout grand MERCI tu m'as enlevé une épine du pied.

    Bonne journée

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

Discussions similaires

  1. Selection d'une partie d image dans une figure
    Par airballman dans le forum Images
    Réponses: 3
    Dernier message: 26/04/2010, 10h20
  2. Réponses: 8
    Dernier message: 04/05/2007, 12h41
  3. [VB.NET] Redimensionner une image dans un PictureBox
    Par Monster77 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 05/04/2007, 19h24
  4. extraire une partie d'image d'une image source
    Par Zen_Fou dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 24/01/2006, 12h20
  5. comment remplacer une partie de texte dans un champs
    Par patlapi dans le forum Paradox
    Réponses: 4
    Dernier message: 20/11/2003, 15h38

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