SetPixelV - Modification des couleurs d'une image dans une PictureBox

Résolu
Cjvg Messages postés 330 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 26 octobre 2017 - 25 févr. 2012 à 12:30
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 25 févr. 2012 à 17:52
Bonjour

Cette procédure a fonctionné correctement. L'instruction SetPixelV (Ou Setpixel) ne marche plus ?

'-----------------------------------------------------------------------------------'
' '
' Remplace une ou plusieurs Couleurs par une Autre '
' '
'-----------------------------------------------------------------------------------'
Sub ReplaceCoul(Picture As PictureBox)
Dim CouleurLu As String
Dim OldCouleur As String
Dim NewCouleur As Long

OldCouleur = " " & NAM.Text4(1).Text & " " ' Liste des Couleurs à remplacer .
NewCouleur = Val(NAM.Text4(0).Text) ' Couleur de remplacement .
Picture.ScaleMode = 1

For I1 = 0 To Picture.ScaleWidth
NAM.Label10.Caption = I1 & "/" & Picture.ScaleWidth
DoEvents

For I2 = 0 To Picture.ScaleHeight
CouleurLu = " " & GetPixel(Picture.hdc, I1, I2) & " "
If InStr(OldCouleur, CouleurLu) > 0 Then
SetPixelV Picture.hdc, I1, I2, NewCouleur
Picture.Refresh
End If
Next I2
Next I1

Picture.Refresh
NAM.Label10.Caption = "Remplacer"

End Sub



Si vous avez la réponse .....


Par avance merci

9 réponses

Cjvg Messages postés 330 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 26 octobre 2017
25 févr. 2012 à 16:12
Je viens de trouver l'erreur

La propriété de la PictureBox AutoReDraw était à False

Avec AutoReDraw = True
, Le Source joint à ma question fonctionne maintenant correctement.

PS: Retirer l'instruction Picture.refresh après le SetPixelV pour éviter que le programme se traîne.


Merci encore

Désolé pour le dérangement.
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 févr. 2012 à 12:45
Bonjour,
Ta question en appelle au moins deux autres :
1) Où est ta fonction SetPixelV et que contient-elle ?
2) es-tu certain de développer sous VB6 (la présente section du forum) ?

et une observation :
- Appeler Picture (mot réservé sous VB6) un objet est pour le moins étonnant.

Tu pourrais peut-être faire un petit tour sur les sources déposés par mon "frère jumeau" jmfmarques. Il est probable que tu y trouveras ce que tu cherches.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Cjvg Messages postés 330 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 26 octobre 2017
25 févr. 2012 à 12:57
Comme cela est dit dans ma question: Cette procédure a fonctionné correctement


Dans le même Module


Public Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Byte
Public Declare Function GetDC Lib "user32" (ByVal hWnd As Long) As Long
Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Public Declare Function GetCursorPos Lib "user32" (lpPoint As PointAPI) As Long
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 févr. 2012 à 13:15
Je ne vois rien d'autre à ajouter à ce que je t'ai dit, sauf, peut-être :
- répéter que tu devrais éviter le mot Picture
- typer I1 et I2
- que s'il s'agit de remplacer une couleur exacte, SetPixel sera recommandé
- que la fonction GetLastError de l'Api de Windows est à utiliser pour y voir clair.
Le fait que
Cette procédure a fonctionné correctement.
ne révèle rien de concret, ni de précis.

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0

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

Posez votre question
Cjvg Messages postés 330 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 26 octobre 2017
25 févr. 2012 à 15:14
- I1 et I2 sont déclarés Integer dans le module.

- J'ai remplacé Picture par PicImage

- J'ai remplacé SetPixelV par SetPixel

- j'ai rajouté la fonction GetLastError

- J'ai regardé et téléchargé plusieurs Projets du jumeau comme par exemple les dégradés de couleur....(mais aucune source ne traite ce sujet)

--------------------------------------------------------------
Setpixel ne change toujours pas la couleur de l'image

Avant de poser une question, je fais toujours des recherches sur Internet.(Pour ce sujet, Beaucoup de question sur Setpixel qui ne marche pas)

A priori, mon code semble correct

Merci quand mê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
25 févr. 2012 à 16:26
Je ne sais pas comment tu as cherché parmi mes sources (mais sous le pseudo jmfmarques).
L'analyse du bout de code que tu montres donne à penser que, dans un contrôle picturebox, tu veux remplacer une couleur par une autre. Si tel est bien le cas, l'un de mes sources montre comment le faire, tant par effet "rouleau" (pour les pixels contigus dans cette couleur) que pour tous les pixels, contigus ou non, de cette couleur.
Tu verras que, dans un cas comme dans l'autre, je me sers de la même fonction de l'API de Windows, considérant simplement que des pixels isolés ne sont jamais rien d'autre que des aires également (et je traites des aires)
Voici le lien vers ce source :
Tapez le texte de l'url ici.
Mais en cherchant un peu plus, tu trouveras un autre source de moi (toujours sous le pseudo jmfmarques) qui, lui, va beaucoup plus loin en matière de transformation des images !
Celui-ci, par exemple :
Tapez le texte de l'url ici.
utilise la fonction SetPixel

Ces deux sources sont très très vieux (voilà bientôt 15 ans, en fait, que je les ai écrits). Ils ont été écrits à l'aide de VB5 !(raison pour laquelle tu y trouveras entre autres des fonctions "maison" pour faire ce que font déjà des fonctions de VB6, non existantes sous VB5.
Je les ai assortis d'un volume considérable de commentaires, pour en faciliter la compréhension, notamment pour ce qui est de l'utilisation des fonctions de l'Api de Windows.
Voilà
si tu ne trouves pas ton bonheur dans tout cela, je ne vois plus comment t'aider.

Je voudrais ajouter une chose : rien ne t'empêche de remplacer la fonction serpixel de l'Api de Windows par la méthode Pset de VB6 (elle te tend les bras).

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 févr. 2012 à 16:28
Bon.
Je vois ta réponse frappée pendant que je frappais la mienne.
Bon dimanche.


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Cjvg Messages postés 330 Date d'inscription mercredi 6 décembre 2000 Statut Membre Dernière intervention 26 octobre 2017
25 févr. 2012 à 17:20
J'ai oublié de mentionner qu'il faut également remplacer ScalMode = 1
par Picture.ScaleMode = 3
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
25 févr. 2012 à 17:52
J'ai oublié de mentionner qu'il faut également remplacer ScalMode = 1
par Picture.ScaleMode = 3

Pas nécessairement.
Intéresse-toi aux méthodes ScaleX et ScaleY
Autres points d'intérêt :
propriétés
TwipsperPixelX et TwipsPerPixelY de l'objet Screen


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
0
Rejoignez-nous