cs_nicolasheurtevin
Messages postés88Date d'inscriptionsamedi 8 février 2003StatutMembreDernière intervention29 août 2006
-
17 nov. 2003 à 11:50
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 2021
-
17 nov. 2003 à 14:40
Bonjour,
Je travaille sur une application de broderie qui permet de transformer du texte en points de croix, je m'explique :
J'ai un champ texte txtTexte dans lequel je saisis la chaine de caractères qui va être tranformée. Je la transfère ensuite dans une objet picturebox Picture1 au moyen de l'api textout. Enfin je balaye un a un les pixels (avec getpixel) de mon Picture1 et je teste pour chacun s'il est noir ou blanc. S'il est noir je met une croix dans mon champ Text1 destination, sinon un blanc.
Au final, j'obtient un TextBox Text1 contenant des blancs ou des croix
Exemple :
pour la lettre o, le résultat sera :
xxx
x x
x x
x x
xxx
Voici mon code :
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
TextOut Me.Picture1.hdc, 0, 0, Me.txtTexte, Len(Me.txtTexte)
For i = 0 To Me.Picture1.Height / 15
For j = 0 To Me.Picture1.Width / 15
couleur = GetPixel(Me.Picture1.hdc, j, i)
If couleur > 0 Then
Me.Text1 = Me.Text1 & " "
Else
Me.Text1 = Me.Text1 & "x"
End If
Next j
Me.Text1 = Me.Text1 & vbCrLf
Next i
End Sub
Seul problème : ça me balaye mon Picture1 de manière bizarre
Si quelqu'un a une idée la dessus ou connait un code similaire au mien ...
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 17 nov. 2003 à 13:40
Utilises une police a Chasse Fixe Comme une Courier, par exemple....
j'ai amélioré ton algo en utilisant TextWidth & TextHeight, plutôt que de tester chaque pixel....
Private Sub cmdOk_Click()
TextOut Me.Picture1.hdc, 0, 0, Me.txtTexte, Len(Me.txtTexte)
For i = 0 To Picture1.TextHeight(txtTexte)
For j = 0 To Picture1.TextWidth(txtTexte)
If GetPixel(Me.Picture1.hdc, j, i) > 0 Then
Me.Text1 = Me.Text1 & " "
Else
Me.Text1 = Me.Text1 & "x"
End If
Next j
Me.Text1 = Me.Text1 & vbCrLf
DoEvents
Next i
End Sub
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202174 17 nov. 2003 à 13:59
Une optimisation du code dirait même :
Private Sub cmdOk_Click()
Dim Buffer As String
TextOut Me.Picture1.hdc, 0, 0, Me.txtTexte, Len(Me.txtTexte)
For i = 0 To Picture1.TextHeight(txtTexte)
For j = 0 To Picture1.TextWidth(txtTexte)
Buffer = Buffer & IIf(GetPixel(Me.Picture1.hdc, j, i) > 0, " ", "x")
Next j
Buffer = Buffer & vbCrLf
Next i
Text1.Text = Buffer
End Sub
En effet, l'utilisation d'une variable intermediaire, accelere la chose : en utilisant Text1.Text, le contenu du controle est mis a jour sans arret, et comme on le fait pour chaque pixel....... c'est prohibitif !
On aurait pu faire ca en recuperant un tableau des bits de l'image.... (GetDIBBits, je crois...) ainsi, tu as quelque chose de plus maniable....