Enregistrer une image de picturebox sous forme d'un hexagone

mounaTN Messages postés 16 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 13 avril 2016 - 16 nov. 2013 à 14:00
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 - 17 nov. 2013 à 19:46
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

NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
16 nov. 2013 à 14:17
As-tu essayer Color.FromARGB (...) avec la surcharge des 4 paramètres : ARGB, notamment le A(lpha) ?
0
mounaTN Messages postés 16 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 13 avril 2016
16 nov. 2013 à 15:01
oui j'ai utilisé alpha pour rendre les pixels qui sont à l'extérieur de l'hexagone transparents (puisque l'image est sauvegardé sous forme de rectangle) et garder juste les couleurs des pixels qui sont dans l'hexagone
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
16 nov. 2013 à 15:02
Et donc, ton problème est résolu ou pas ?
Si non, dire ce qui pose problème.
0
mounaTN Messages postés 16 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 13 avril 2016
16 nov. 2013 à 15:07
non j'ai pas pu mettre les pixels à l'extérieur de l'hexagone transparents c ça le problème
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
16 nov. 2013 à 15:18
Je ne vois pas dans ton code l'usage de la couleur transparente en tout cas, Avant de copier, essayes de peindre la surface de ton Bitmap en transparent.
0
mounaTN Messages postés 16 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 13 avril 2016
16 nov. 2013 à 15:21
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
16 nov. 2013 à 17:58
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".
0
mounaTN Messages postés 16 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 13 avril 2016
16 nov. 2013 à 18:06
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 16/11/2013 à 18:09
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
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
16 nov. 2013 à 18:31
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)
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 16/11/2013 à 19:58
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
CGSI3 Messages postés 416 Date d'inscription vendredi 22 février 2008 Statut Membre Dernière intervention 7 janvier 2018 1
17 nov. 2013 à 04:26
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



--
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
Modifié par ucfoutu le 17/11/2013 à 08:21
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
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
17 nov. 2013 à 10:28
Bonjour mounaTN.
J'entrevois une solution, pourvu que votre hexagone soit convexe. Est-ce le cas ?
Cordialement.
0
mounaTN Messages postés 16 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 13 avril 2016
17 nov. 2013 à 12:07
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.
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
17 nov. 2013 à 14:29
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) ?
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
17 nov. 2013 à 14:44
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.
0
mounaTN Messages postés 16 Date d'inscription samedi 9 novembre 2013 Statut Membre Dernière intervention 13 avril 2016
Modifié par mounaTN le 17/11/2013 à 14:46
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
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 nov. 2013 à 17:34
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).
0
Zermelo Messages postés 378 Date d'inscription samedi 22 septembre 2012 Statut Membre Dernière intervention 13 août 2017 14
17 nov. 2013 à 17:28
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.
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
17 nov. 2013 à 19:46
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.
0
Rejoignez-nous