Trouver une ressource (Nouvelle version du moteur, plus rapide & pertinent, essayez le !)
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
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.
Fichier Zip
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
Historique
- 24 décembre 2004 21:43:47 :
Sources de la même categorie
Commentaires
|
|