begin process at 2008 08 22 03:58:13
1 229 768 membres
39 nouveaux aujourd'hui
14 267 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

TRACER LES CONTOURS D'UNE IMAGE


Information sur la source

Catégorie :Graphique Niveau : Débutant Date de création : 24/12/2004 Date de mise à jour : 24/12/2004 21:43:47 Vu / téléchargé: 6 156 / 738

Note :
Aucune note

Commentaire sur cette source (6)
Ajouter un commentaire et/ou une note


Description

Une petite source pour moustachu et ennixo.

Moustachu voulait savoir comment appliquer un antialiasing aux contours d'une image, alors que ennixo ne me coryait pas que c'est aussi facile de tracé un contour.

Donc, voici ma réponde : pour tracé les contours d'une image, il suffit d'appliquer deux matrices :
1 0 -1
1 0 -1
1 0 -1

puis
1 1 1
0 0 0
-1 -1 -1

Ce qui donne au final l'application d'une matrice
2 1 0
1 0 -1
0 -1 -2

Le code n'est pas trop compliqué, il se base sur ma classe de gestion d'image, donc le code sera bien plus rapide en compilé qu'en interprêté !

Source

  • Private Sub cmdTrace_Click(Index As Integer)
  • 'déclaration des variables privées
  • Dim oGestionImageSrc As New CGestionImage
  • Dim oGestionImageDest As New CGestionImage
  • Dim iFor1 As Integer 'stocke les valeurs de la boucle For->Next
  • Dim iFor2 As Integer 'stocke les valeurs de la boucle For->Next
  • Dim iBleu As Byte 'stocke la composante bleue à récupèrer
  • Dim iVert As Byte 'stocke la composante verte à récupèrer
  • Dim iRouge As Byte 'stocke la composante rouge à récupèrer
  • Dim iBleuCouleur As Double 'stocke la composante bleue à appliquer
  • Dim iVertCouleur As Double 'stocke la composante verte à appliquer
  • Dim iRougeCouleur As Double 'stocke la composante rouge à appliquer
  • 'on définit les contrôles sources et destination
  • Set oGestionImageSrc.PictureBox = pctSource
  • Set oGestionImageDest.PictureBox = pctDest
  • 'on parcourt les pixels 1 à 1 et on applique une matrice de tracé de contour
  • For iFor1 = 0 To pctDest.ScaleWidth
  • For iFor2 = 0 To pctDest.ScaleHeight
  • 'on définit l'index du zoom sur X et Y
  • Let iBleuCouleur = 0
  • Let iVertCouleur = 0
  • Let iRougeCouleur = 0
  • 'on définit la couleur du pixel courant à partir des pixels alentours
  • Call oGestionImageSrc.GetPixelRGB(iFor1 - 1, iFor2 - 1, iRouge, iVert, iBleu)
  • Let iBleuCouleur = iBleuCouleur + iBleu * 2
  • Let iVertCouleur = iVertCouleur + iVert * 2
  • Let iRougeCouleur = iRougeCouleur + iRouge * 2
  • Call oGestionImageSrc.GetPixelRGB(iFor1 + 1, iFor2 + 1, iRouge, iVert, iBleu)
  • Let iBleuCouleur = iBleuCouleur - iBleu * 2
  • Let iVertCouleur = iVertCouleur - iVert * 2
  • Let iRougeCouleur = iRougeCouleur - iRouge * 2
  • Call oGestionImageSrc.GetPixelRGB(iFor1, iFor2 - 1, iRouge, iVert, iBleu)
  • Let iBleuCouleur = iBleuCouleur + iBleu
  • Let iVertCouleur = iVertCouleur + iVert
  • Let iRougeCouleur = iRougeCouleur + iRouge
  • Call oGestionImageSrc.GetPixelRGB(iFor1, iFor2 + 1, iRouge, iVert, iBleu)
  • Let iBleuCouleur = iBleuCouleur - iBleu
  • Let iVertCouleur = iVertCouleur - iVert
  • Let iRougeCouleur = iRougeCouleur - iRouge
  • Call oGestionImageSrc.GetPixelRGB(iFor1 - 1, iFor2, iRouge, iVert, iBleu)
  • Let iBleuCouleur = iBleuCouleur + iBleu
  • Let iVertCouleur = iVertCouleur + iVert
  • Let iRougeCouleur = iRougeCouleur + iRouge
  • Call oGestionImageSrc.GetPixelRGB(iFor1 + 1, iFor2, iRouge, iVert, iBleu)
  • Let iBleuCouleur = iBleuCouleur - iBleu
  • Let iVertCouleur = iVertCouleur - iVert
  • Let iRougeCouleur = iRougeCouleur - iRouge
  • If iBleuCouleur > 255 Then Let iBleuCouleur = 255
  • If iVertCouleur > 255 Then Let iVertCouleur = 255
  • If iRougeCouleur > 255 Then Let iRougeCouleur = 255
  • If iBleuCouleur < 0 Then Let iBleuCouleur = 0
  • If iVertCouleur < 0 Then Let iVertCouleur = 0
  • If iRougeCouleur < 0 Then Let iRougeCouleur = 0
  • If Index = 0 Then
  • 'contour + image
  • Let iVertCouleur = Abs(iVertCouleur - iVert)
  • Let iBleuCouleur = Abs(iBleuCouleur - iBleu)
  • Let iRougeCouleur = Abs(iRougeCouleur - iRouge)
  • End If
  • Call oGestionImageDest.SetPixelRGB(iFor1, iFor2, iRougeCouleur, iVertCouleur, iBleuCouleur)
  • DoEvents
  • Next iFor2
  • Next iFor1
  • Call oGestionImageDest.Refresh
  • End Sub
Private Sub cmdTrace_Click(Index As Integer)

'déclaration des variables privées
Dim oGestionImageSrc As New CGestionImage
Dim oGestionImageDest As New CGestionImage
Dim iFor1 As Integer 'stocke les valeurs de la boucle For->Next
Dim iFor2 As Integer 'stocke les valeurs de la boucle For->Next
Dim iBleu As Byte 'stocke la composante bleue à récupèrer
Dim iVert As Byte 'stocke la composante verte à récupèrer
Dim iRouge As Byte 'stocke la composante rouge à récupèrer
Dim iBleuCouleur As Double 'stocke la composante bleue à appliquer
Dim iVertCouleur As Double 'stocke la composante verte à appliquer
Dim iRougeCouleur As Double 'stocke la composante rouge à appliquer
    
    'on définit les contrôles sources et destination
    Set oGestionImageSrc.PictureBox = pctSource
    Set oGestionImageDest.PictureBox = pctDest

    'on parcourt les pixels 1 à 1 et on applique une matrice de tracé de contour
    For iFor1 = 0 To pctDest.ScaleWidth
    
        For iFor2 = 0 To pctDest.ScaleHeight
        
            'on définit l'index du zoom sur X et Y
            Let iBleuCouleur = 0
            Let iVertCouleur = 0
            Let iRougeCouleur = 0
            
            'on définit la couleur du pixel courant à partir des pixels alentours
            Call oGestionImageSrc.GetPixelRGB(iFor1 - 1, iFor2 - 1, iRouge, iVert, iBleu)
            Let iBleuCouleur = iBleuCouleur + iBleu * 2
            Let iVertCouleur = iVertCouleur + iVert * 2
            Let iRougeCouleur = iRougeCouleur + iRouge * 2
            Call oGestionImageSrc.GetPixelRGB(iFor1 + 1, iFor2 + 1, iRouge, iVert, iBleu)
            Let iBleuCouleur = iBleuCouleur - iBleu * 2
            Let iVertCouleur = iVertCouleur - iVert * 2
            Let iRougeCouleur = iRougeCouleur - iRouge * 2
            Call oGestionImageSrc.GetPixelRGB(iFor1, iFor2 - 1, iRouge, iVert, iBleu)
            Let iBleuCouleur = iBleuCouleur + iBleu
            Let iVertCouleur = iVertCouleur + iVert
            Let iRougeCouleur = iRougeCouleur + iRouge
            Call oGestionImageSrc.GetPixelRGB(iFor1, iFor2 + 1, iRouge, iVert, iBleu)
            Let iBleuCouleur = iBleuCouleur - iBleu
            Let iVertCouleur = iVertCouleur - iVert
            Let iRougeCouleur = iRougeCouleur - iRouge
            Call oGestionImageSrc.GetPixelRGB(iFor1 - 1, iFor2, iRouge, iVert, iBleu)
            Let iBleuCouleur = iBleuCouleur + iBleu
            Let iVertCouleur = iVertCouleur + iVert
            Let iRougeCouleur = iRougeCouleur + iRouge
            Call oGestionImageSrc.GetPixelRGB(iFor1 + 1, iFor2, iRouge, iVert, iBleu)
            Let iBleuCouleur = iBleuCouleur - iBleu
            Let iVertCouleur = iVertCouleur - iVert
            Let iRougeCouleur = iRougeCouleur - iRouge
            
            If iBleuCouleur > 255 Then Let iBleuCouleur = 255
            If iVertCouleur > 255 Then Let iVertCouleur = 255
            If iRougeCouleur > 255 Then Let iRougeCouleur = 255
            If iBleuCouleur < 0 Then Let iBleuCouleur = 0
            If iVertCouleur < 0 Then Let iVertCouleur = 0
            If iRougeCouleur < 0 Then Let iRougeCouleur = 0
            
            If Index = 0 Then

                'contour + image
                Let iVertCouleur = Abs(iVertCouleur - iVert)
                Let iBleuCouleur = Abs(iBleuCouleur - iBleu)
                Let iRougeCouleur = Abs(iRougeCouleur - iRouge)

            End If
                        
            Call oGestionImageDest.SetPixelRGB(iFor1, iFor2, iRougeCouleur, iVertCouleur, iBleuCouleur)
            
            DoEvents
            
        Next iFor2
        
    Next iFor1
    
    Call oGestionImageDest.Refresh
    
End Sub

Conclusion

Je ne pense pas mettre cette source à jour vu qu'il ne s'agit que d'une méthode pour tracer les contours d'une image.
Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

24 décembre 2004 21:43:47 :
  • signaler à un administrateur
    Commentaire de ennixo le 24/12/2004 10:15:22

    ok mais là c pas du tout un anticrénelage....

    un anticrénelage c ça : http://ennixo.free.fr/anticrenelage.gif

  • signaler à un administrateur
    Commentaire de moustachu le 24/12/2004 10:19:22

    :'o), c'est noël  je suis très ému ! Je vais voir comment tu traduis tes matrices pour te classes !

    ++
    Moustachu

  • signaler à un administrateur
    Commentaire de DARKSIDIOUS le 24/12/2004 11:31:33 administrateur CS

    ennixo : je n'ai pas dit qu'il s'agissait d'un anticrénelage, mais du tracé des contours, ce n'est pas pareil !

    Pour l'anticrénelage, voir ici :

    http://www.vbfrance.com/code.aspx?ID=28386

    Par contre, je n'obtiens pas tout à faire le même résultat que toi, mais le principe reste le même ! (j'obtiens un résultat meilleur dans certaines parties, et moins bon dans d'autres, car je ne dois pas utiliser la même matrice de flou !)

    DarK Sidious

  • signaler à un administrateur
    Commentaire de ennixo le 24/12/2004 15:54:07

    pour réaliser un bon anticrénelage une simple matrice ne suffit pas...

    ce que je t'ai montré est un fake car je n'ai fait aucun algo d'anticrénelage, mais c t juste pour te montrer ce que ça doit faire.

    et oui tu dis ici que c'est un tracé des contours mais ce qu'on t'avait demandé c'est un anticrénelage =)

    bon aller joyeux noel, je reviendrai pas avant qqes jours =)

  • signaler à un administrateur
    Commentaire de vanoise le 24/01/2005 13:47:46

    Ma question est la suivante et ressemble un peu aux autres.
    Si je dois tracer un cercle d epaisseur 2 pixels avec la methode de Bresenham.
    Je trace en fait 2 cercles, 1 avec un rayou r, l autre r+1.
    Ca marche ms sur un Display, il reste des points blancs car 4 pixels ne sont pas allumes a la bonne place. (Il y a 1 pixel d ecart)
    Comment je fais pour tracer mon cercle  et que tout reste noir?

  • signaler à un administrateur
    Commentaire de DARKSIDIOUS le 24/01/2005 13:56:39 administrateur CS

    vanoise : je n'en ai aucune idée. Cette source n'est là que pour vous montrer comment tracer les contours d'une image, mais je n'ai jamais dit qu'elle était fiable à 100 %. C'est juste pour avoir un détourage grossier.

    DarK Sidious

Ajouter un commentaire

Pub



Appels d'offres

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Boutique

Boutique de goodies CodeS-SourceS