Enregistrer une image de picturebox sous forme d'un hexagone

Signaler
Messages postés
16
Date d'inscription
samedi 9 novembre 2013
Statut
Membre
Dernière intervention
13 avril 2016
-
Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
-
Bonsoir;

j'ai développe une application permettant l'extraction des sourcils sous formes d'un hexagone mais j'ai pas pu réussir y sauvegarder , en faite, je veux sauvegarder la zone de sourcils sous forme d'un rectangle puis mettre les pixels à l'extérieur comme étant transparents.
voilà le code que j'ai développé:

Private Sub Button11_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button11.Click
        box_x = Val(x_4_6.Text) - (Val(ES0.Text) / 4)
        box_y = Val(y_4_4.Text) - ir
        With Me.SaveFileDialog4
            .DefaultExt = "png"
            .FileName = "sourcils.png"
            .ShowDialog()
            If .FileName = "" Then Exit Sub
        End With
        Dim box_width1 As Integer = Math.Abs((Val(x_4_2.Text) + ES / 4) - Val(x_4_6.Text))
        Dim box_height1 As Integer = Math.Abs(Val(y_P1.Text) - Val(y_4_4.Text))
        'creation d'un bitmap pour recevoir la zone
        Dim bmp_cible_sourcils As New Bitmap(box_width1, box_height1)

        'on copie les pixels
        Dim x, y As Integer
        For x = 0 To bmp_cible_sourcils.Width - 1
            For y = 0 To bmp_cible_sourcils.Height - 1
                Dim mColor As System.Drawing.Color = bmp2.GetPixel(Me.box_x + x, Me.box_y + y)
                bmp_cible_sourcils.SetPixel(x, y, mColor)
            Next
        Next
        bmp_cible_sourcils.Save(Me.SaveFileDialog4.FileName, Drawing.Imaging.ImageFormat.Png)
    End Sub


j'attends vos aides et merci d'avance

9 réponses

Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
148
As-tu essayer Color.FromARGB (...) avec la surcharge des 4 paramètres : ARGB, notamment le A(lpha) ?
Messages postés
16
Date d'inscription
samedi 9 novembre 2013
Statut
Membre
Dernière intervention
13 avril 2016

je peux vous envoyer l'image que j'ai obtenue et vous pouvez me comprendre mieux ce que je cherche, j'ai pas pu trouver le code nécessaire résolvant mon problème
Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
148
Oui, essayes d'héberger l'image et de poster le lien vers celle-ci, car je peine à voir ton problème.
Messages postés
16
Date d'inscription
samedi 9 novembre 2013
Statut
Membre
Dernière intervention
13 avril 2016

ok ce lien contenant le résultat obtenu
http://hpics.li/bfa3bc1
Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
148
Donc, je reprend pour bien mettre au point ta question :
Tu veux faire en sorte de rendre transparente une image, sauf dans une partie délimitée entre 2 hexagone.
Actuellement, tu bloques sur "comment déterminer la zone à conserver.

Pour t'aider, il faut savoir :
- Les délimitations vienne-t-elle d'une autre image ou sont-elles déjà incluses dans l'image ?
Messages postés
16
Date d'inscription
samedi 9 novembre 2013
Statut
Membre
Dernière intervention
13 avril 2016

en effet, j'ai utilisé la norme MPEG-4 pour déterminer les différents points autour des yeux et des sourcils
puis à partir de l'image de picturebox, j'ai dessiner un hexagone autour de chaque sourcil (pour l'extraire chacune tout seul) pour cela j'ai crée une image à partir celle de picturebox sous forme d'un rectangle autour des sourcils
le hauteur de l'image est:
 Math.Abs(Val(y_P1.Text) - Val(y_4_4.Text))

et le largeur :
Math.Abs((Val(x_4_2.Text) + ES / 4) - Val(x_4_6.Text))

puis je sauvegarde l'image crée mais j'obtient tout le rectangle alors je veux juste les pixels à l'intérieur de l'hexagone
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bonjour,
S'agissant d'un contrôle Picturebox placé au desus d'une autre picturebox, ce que tu veux faire ne peut que se traduire ainsi :
- soit attribuer aux pixels d'une couleur autre que les sourcils la couleur des pixels qu'ils recouvrent de l'autre picturebox ===>> lenteur alors inévitable
- soit construire une picturebox à périmètre non régulier (celui des sourcils) ===>> demande l'utilisation et la bonne connaissance de fonctions complexes de l'Api de Windows.
D'autres solutions existent, mais alors pas avec deux pictureboxes superposées.
PS : il y a eu au moins deux discussions au cours des 10 derniers jours à propos de problèmes similaires (2 pictureboxes superposées dont celle du dessus laisse "voir" tout ce qui se trouve "en-dessous" hormis le dessin que l'on veut voir "prendre le pas".
Messages postés
16
Date d'inscription
samedi 9 novembre 2013
Statut
Membre
Dernière intervention
13 avril 2016

salut , il ne s'agit pas de deux picturebox, mais c la même où j'ai dessiné un graphique hexagone et je veux enregistrer cette zone sous forme rectangulaire avec les pixels qui existe à l'extérieur de l'hexagone sont transparents
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Je vois, en relisant, qu'il ne s'agit finalement pas de superposition de pictureboxes, mais d'extraction d'une partie non rectangulaire d'une pictureboxA ===>>> pictureboxB non rectangulaire (c'est celà, ta "transparence").
Alors là : impossible sans l'utilisation de fonctions complexes de l'Api de Windows.
Le problème est bel et bien celui de la "fabrication" d'une picturebox non rectangulaire.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
148
L'utilisation des fonctions de l'objet Bitmap est possible et assez simplifiées, de plus, elles sont rapides (je pense presque autant ue les appels API (Rappel, c'est du .NET)
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Tu as probablement raison, NHenry...
J'aimerais toutefois connaître (je suis très curieux) celle de ces fonctions de l'objet BitMap que tu utiliserais dans un tel cas. Et bien sûr : ce qu'elle ferait exactement.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
416
Date d'inscription
vendredi 22 février 2008
Statut
Membre
Dernière intervention
7 janvier 2018
1
Bonsoir,
c'est peut être hors sujet ... quoi que ..
mais je précise juste qu'il existe une bibliothèque qui permet d'extraire certains paramètres d'un visage tout simplement.

http://codes-sources.commentcamarche.net/forum/affich-1633759-utiliser-l-outil-opencv-sous-vb-net

Ne sachant pas quel est la finalité de ton programme, je te donne ce lien pour info.
Bon courage CGSI3

    ''' <summary>
    ''' Retourne une liste de Rectangle selon le Filtre descripteur
    ''' </summary>
    ''' <param name="img">Image(Of Bgr, Byte)</param>
    ''' <remarks>renvoi un List(Of System.Drawing.Rectangle)</remarks>
    Public Function ChRec(ByRef Img As Image(Of Gray, Byte), ByRef Filtre As String) As List(Of System.Drawing.Rectangle)
        Dim DRec As New List(Of System.Drawing.Rectangle)
        Dim eyeDetector As New CascadeClassifier("C:\Users\confo\Desktop\Downloads\OpenCV\emgucv-windows-universal-gpu 2.4.9.1847\opencv\data\haarcascades\" & Filtre)
        For Each face As Rectangle In eyeDetector.DetectMultiScale(Img, 1.1, 10, New Size(20, 20), Size.Empty)
            'Img.Draw(face, New Bgr(Col), 2)
            DRec.Add(face)
        Next
        Return DRec
    End Function

    ''' <summary>
    ''' Imprime une liste de Rectangle
    ''' </summary>
    ''' <param name="img">Image(Of Bgr, Byte)</param>
    ''' <remarks>Affiche un List(Of System.Drawing.Rectangle)</remarks>
    Public Sub DrawRec(ByRef Img As Image(Of Bgr, Byte), ByRef Filtre As List(Of System.Drawing.Rectangle), ByRef Couleur As Color, Optional ByVal Larg As Integer = 1)
        For Each face As Rectangle In Filtre
            Img.Draw(face, New Bgr(Couleur), Larg)
        Next
    End Sub

    ''' <summary>
    ''' renvoi une liste de Rectangle décrivant le visage
    ''' </summary>
    ''' <param name="img">Image(Of Bgr, Byte)</param>
    ''' <remarks>Affiche un List(Of System.Drawing.Rectangle)</remarks>
    Public Sub Visage_Rectangle(ByRef Img As Image(Of Bgr, Byte), Optional ByRef DRec As List(Of System.Drawing.Rectangle) = Nothing)
        'Convert the image to Grayscale
        Dim imgGray As Image(Of Gray, Byte) = Img.Convert(Of Gray, Byte)()
        DRec = ChRec(imgGray, "haarcascade_frontalface_default.xml")
        DrawRec(Img, DRec, Color.Pink, 5)
        DRec = ChRec(imgGray, "frontalEyes35x16.xml")
        DrawRec(Img, DRec, Color.Blue, 4)
        DRec = ChRec(imgGray, "haarcascade_mcs_mouth.xml")
        DrawRec(Img, DRec, Color.Red, 3)
        DRec = ChRec(imgGray, "haarcascade_fullbody.xml")
        DrawRec(Img, DRec, Color.Beige, 2)
        DRec = ChRec(imgGray, "rightEye.xml")
        DrawRec(Img, DRec, Color.Brown)
        DRec = ChRec(imgGray, "nez.xml")
        DrawRec(Img, DRec, Color.DarkOrange)
    End Sub



--
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
Bon...
Je vais tenter d'exposer la raison fondamentale de mes réactions depuis le début de la présente discussion ===>>
Ce qui m'interpelle dès le tout premier message est cette proposition :
"en faite, je veux sauvegarder la zone de sourcils sous forme d'un rectangle puis mettre les pixels à l'extérieur comme étant transparents".
Copier une partie rectangulaire de l'image d'une picturebox est simple et je ne crois donc pas que là soit la difficulté.
Rendre transparents tous les pixels autres que ceux occupés par les sourcils est, par contre, LA difficulté. Et cette difficulté est d'autant plus sérieuse que les pixels à "rendre transparents" ne sont pas tous de la même couleur.
Il est pour moi clair que le rectangle "sauvegardé" :
- ne peut qu'être un fichier image
- que ce fichier, si utilisé comme je le devine, dans une picturebox, devra être traité au moment de l'affichage de la picturebox
- que pour parvenir à n'afficher que les sourcils (s'agissant, répétons-le, d'une picturebox), le traitement n'aura d'autre choix que celui de la "fabrication" d'une picturebox à contour non rectangulaire (les sourcils seuls, sans même les "parties" séparant les poils !)

Tout cela n'est réalisable qu'à la condition que les pixels de l'image à sauvegarder aient, préalablement à la sauvegarde du rectangle sélectionné, été dotés de la même couleur (unique pour tous) et que cette couleur soit distincte des couleurs utilisées par les sourcils. Cette couleur peut astucieusement être choisie (par exemple RGB(0,1,254 car le bleu, et en particulier très exactement celui-ci, n'aura pratiquement aucune chance d'être présent parmi les pixels des poils des sourcils ..)
Et c'est au moment même du chargement dans la picturebox, que l'on va traiter ainsi :
- 1) on repère la couleur à ignorer (aux coordonnées d'un coin, par exemple (1,1) . Ce procédé permet de ne pas avoir à enregistrer quelque part la couleur à ignorer (ce qui permet un programme utilisable pour plusieurs fichiers image différents)
2) Et nous y voilà maintenant : il va falloir maintenant créer la picturebox non rectangulaire, composée de la seule surface des sourcils).J'ignore (un salut à NHenry) si VB.Net offre une "fonction" capable d'accomplir cette tâche-là. Elle est (çà, je le sais bien) par contre réalisable à l'aide de fonctions de l'Api de Windows. La "chose" n'est toutefois pas simple et nécessite des connaissances assez avancées.
Voilà. Moi, j'ai terminé ma participation à cette discussion.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviend
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
14
Bonjour mounaTN.
J'entrevois une solution, pourvu que votre hexagone soit convexe. Est-ce le cas ?
Cordialement.
Messages postés
16
Date d'inscription
samedi 9 novembre 2013
Statut
Membre
Dernière intervention
13 avril 2016

Bonjour ;
merci bien pour votre proposition, mais l'hexagone n'est pas convexe . j'ai réussi à extraire les yeux sous formes des ellipses en appliquant un test en utilisant l'équation de l'ellipse , les pixels qui se trouvent à l'extérieur de l'ellipse sont transparents, je veux appliquer le même chose pour les sourcils mais sous forme d'hexagone mais j'ai pas pu.
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
14
Pouvez-vous alors me donner, dans un cas numériquement connu, la liste des points parcourant l'hexagone, chacun d'eux sous la forme cartésienne (x;y) ?
Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
148
Concernant la méthode de dessin, la page Wikipedia est très instructive :
https://fr.wikipedia.org/wiki/Hexagone

De mon point de vue, le calcul est assez clair :
- Soit une surface carré (de coté X )
- On veux tracer un hexagone horizontal

Donc :
- Les 2 points du milieu sont simplement posés au centre du carré sur les cotés (0,X/2) et (X, X/2)
- Pour les segments en haut et en bas, il faut trouver la formule de calcul pour leur longueur et centrer ce segment en haut et en bas.
- Suite à cela, tracer les 4 segments restants est assez simple.

Concernant la séparation entre pixels transparent et image, tu peux faire une image intermédiaire :
Soit 3 images :
- L'image d'origine (photo)
- L'image masque (La partie à extraire de la photo est peinte de couleur unie (ou l'inverse, la partie à virer est peinte ) )
- L'image finale

Actions :
Pour chaque pixel de l'image finale, si sur l'image masque c'est un pixel de masque, on prend le pixel de la photo pour le mettre sur l'image finale, sinon, on met un pixel transparent

Je, pense que les fonctions de bases fournies par le Framework sont suffisantes sans pour autant utiliser les APIs.
Messages postés
16
Date d'inscription
samedi 9 novembre 2013
Statut
Membre
Dernière intervention
13 avril 2016

je travaille avec la norme MPEG-4 qui définit les différents points de visage dans le cas neutre ainsi que les points autours des yeux et sourcils
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
232
ce que tu proposes, NHenry, n'est plus un résultat avec deux Pictureboxes superposées, mais, à chaque fois, de redessiner sur une picturebox unique. ce à quoi, finalement, je faisais allusion comme contournement possible dans une autre discussion similaire récemment.
Double inconvénient :
- lenteur ajoutée
- difficulté accrue de positionnement si, comme je le devine, il s'agit de "construire" un visage à l'aide d'éléments distincts (un peu comme pour faire un portrait robot). Cette difficulté n'existerait par contre pas avec une picturebox à contour = à celui du seul élément à insérer (ine picturebox se prêtant parfaitement à un déplacement où on le souhaite).
Messages postés
378
Date d'inscription
samedi 22 septembre 2012
Statut
Membre
Dernière intervention
13 août 2017
14
Je précise ma demande. Pour bien comprendre, je voudrais voir un de vos hexagones, puisque vous savez en faire. Pour cela, il me faudrait les coordonnées, exprimées en pixels, des six points déterminant l'hexagone, ces points étant donnés dans l'ordre d'un parcours du périmètre de l'hexagone.
Si vous ne voulez pas me donner ces informations, veuillez au moins me le faire savoir.
Messages postés
14738
Date d'inscription
vendredi 14 mars 2003
Statut
Modérateur
Dernière intervention
23 novembre 2020
148
Relis bien mon message de 14h44, je te donne des pistes pour déterminer les 6 points de l'hexagone.
A toi d'adapter selon tes besoins.