Analyse des couleurs

Résolu
Cluny265 Messages postés 7 Date d'inscription samedi 14 avril 2012 Statut Membre Dernière intervention 12 décembre 2013 - 5 déc. 2013 à 16:10
Cluny265 Messages postés 7 Date d'inscription samedi 14 avril 2012 Statut Membre Dernière intervention 12 décembre 2013 - 8 déc. 2013 à 11:54
Bonjour,
Quelqu'un connaît-il les codes pour connaître la décomposition en RVB du pixel sous le pointeur ?
Cette possibilité existe puisqu'elle est utilisée par Windows lors de la création de couleur. C'est le contraire de Color.FromArgb(R,V,B).

13 réponses

Cluny265 Messages postés 7 Date d'inscription samedi 14 avril 2012 Statut Membre Dernière intervention 12 décembre 2013
5 déc. 2013 à 16:11
Je travaille avec VB2010
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
Modifié par ucfoutu le 5/12/2013 à 17:11
Bonjour, Sans personnellement rien connaître de VB.Net (je développe sous VB6), j'ouvre MSDN sur le mot Color, examine ses méthodes et vois que l'inverse de la méthode Color.FromArgb est la méthode Color.ToArgb. A vrai dire, je n'en suis pas étonné, From voulant dire depuis et To voulant dire vers (non ?)

________________________
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
Cluny265 Messages postés 7 Date d'inscription samedi 14 avril 2012 Statut Membre Dernière intervention 12 décembre 2013
6 déc. 2013 à 12:34
Merci à ucfoutu pour la méthode Color.ToArgb.
L'exemple donné dans MSDN ne concerne que le mode graphique, je souhaite une réponse plus générale commençant au pointeur de la souris pour se terminer par les trois valeurs de la couleur du pixel.
Merci à tous.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
6 déc. 2013 à 13:14
1) Prends s'il te plait l'habitude de répondre en réponse et non en commentaires (on ne s'y retrouve plus)
2) et alors ? Ta question serait-elle finalement comment relever la couleur aux coordonnées du curseur ? (car pour le reste - dès lors qu'est relevée une couleur - tu as déjà eu ta réponse !)
0

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

Posez votre question
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 137
6 déc. 2013 à 13:36
0
cs_ShayW Messages postés 3253 Date d'inscription jeudi 26 novembre 2009 Statut Membre Dernière intervention 3 décembre 2019 57
6 déc. 2013 à 14:15
Bonjour

il n'y a pas de formule magique
il faut créer un bitmap
copie de l'écran dans le bitmap
utiliser la méthode getpixel
http://msdn.microsoft.com/en-us/library/system.drawing.bitmap.getpixel(v=vs.110).aspx

ex savoir le ARGB du pixel à l'évenement mouseup d'un panel

Private Sub Panel1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Panel1.MouseUp
Dim gr As System.Drawing.Graphics
Dim mycolor As System.Drawing.Color
gr = DirectCast(sender, Panel).CreateGraphics
Dim mybitmap As New Bitmap(DirectCast(sender, Panel).Width, DirectCast(sender, Panel).Height, gr)
gr = Graphics.FromImage(mybitmap)
gr.CopyFromScreen(DirectCast(sender, Panel).Location, Point.Empty, New Size(mybitmap.Width, mybitmap.Height), CopyPixelOperation.SourceCopy)
mycolor = mybitmap.GetPixel(e.X, e.Y)
End Sub
0
Cluny265 Messages postés 7 Date d'inscription samedi 14 avril 2012 Statut Membre Dernière intervention 12 décembre 2013
6 déc. 2013 à 18:36
Merci à tous les trois.
- uc foutu. Tu as la bonne question : "Comment relever la couleur aux coordonnées du curseur ? ". On m'a dit autrefois que quand la question est bien posée le pb est à moitié résolu. J'espère l'autre moitié . . .
- cs_ShayW. Et comment je copie une portion ou la toatalité de l'écran dans ce BitMat ?
cs _ Le Pivert. Je n'ai fait que jeter un couip d'oeil à ce programme. Une réponse pertinente (ou non . . .) demande étude.
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
Modifié par ucfoutu le 6/12/2013 à 19:00
Comme je te l'ai dit, je développe sous VB6 (pire, même, puisque le fais carrément en VB5) et non sous VB.Net
Pour faire ce que tu veux et plus encore (y compris l'identification des fenêtres et contrôles "balayés"), j'utilise personnellement sous VB6 les fonctions suivantes de l'API de Windows :
GetPixel Lib de la librairie gdi32
et GetCursorPos, GetWindowDC, FindWindow, WindowFromPoint, GetWindowRect et GetWindowText de la librairie user32
Je ne crée aucun bitmap et je travaille avec un timer

Observation : ne pas, comme je le fais, créer un bitmap de la totalité de l'écran permet de travailler comme on l'entend et où on l'entend (clin d'oeil si j'ai bien compris/deviné ce que tu cherches à faire...)

Je ne sais pas quel est l'équivalent éventuel sous VB.Net.
Voilà donc où s'arrête 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
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 137
6 déc. 2013 à 19:00
Je t'ai fait cela qui est valable sur une PictureBox avec une image:

Public Class Form1
Private Sub PictureBox1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles PictureBox1.MouseDown
Dim colorval As Long
Dim map1 As New Bitmap("C:\chemin fichier image.jpg")
colorval = map1.GetPixel(e.X, e.Y).ToArgb 'code long
' Conversion code long en RGB
Dim g As Byte = CByte(Int((colorval And &HFF00) / &H100))
Dim b As Byte = CByte((Int((colorval And &HFF0000) / &H10000)))
Dim r As Byte = CByte((Int(colorval And &HFF)))
Dim text As String = _
String.Format("red: {0}, green: {1}, blue: {2}", New Object() {r, g, b})
MsgBox(text) 'code RGB
End Sub
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
PictureBox1.Image = Image.FromFile("C:\chemin fichier image.jpg")
End Sub
End Class


Vois si cela te convient
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 209
6 déc. 2013 à 19:03
Bonjour, cs_Le Pivert,
Ton code devrait parfaitement fonctionner.
Il ne sera toutefois utile à Cluny265 que s'il se limite à un seul bitmap et ne cherche pas (comme je crois le deviner) à "balayer" ailleurs.
0
Cluny265 Messages postés 7 Date d'inscription samedi 14 avril 2012 Statut Membre Dernière intervention 12 décembre 2013
6 déc. 2013 à 23:34
Merci encore à ucfoutu et Cs_Le Pivert, vous êtes super sympas.
Je vais me coller à ces essais.
0
ehjoe Messages postés 728 Date d'inscription samedi 4 avril 2009 Statut Membre Dernière intervention 30 mars 2014 4
7 déc. 2013 à 13:21
Bonjour,


Private Declare Function GetPixel Lib "gdi32" Alias "GetPixel" _
(ByVal hdc As Int32, ByVal x As Int32, ByVal y As Int32) As Int32
Dim xx, yy As Long
Sub Form2_MouseClick...
If e.Button <> Windows.Forms.MouseButtons.Left Then Exit Sub
Dim pixelColor As Color
Using g As Graphics = Graphics.FromHwnd(Me.Handle)
pixelColor = ColorTranslator.FromWin32(GetPixel(g.GetHdc(), xx, yy))
End Using
HScrollBar1.Value = pixelColor.R
HScrollBar2.Value = pixelColor.G
HScrollBar3.Value = pixelColor.B
End Sub

Cordialement, Joe.
0
cs_Le Pivert Messages postés 7904 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 14 août 2024 137
7 déc. 2013 à 15:06
Bonjour ehJoe ,

Très bien ce code, j'ai juste fait une petite rectif. Je l'ai mis dans l'évenement MouseDown du Form

    Private Declare Function GetPixel Lib "gdi32" Alias "GetPixel" _
(ByVal hdc As Int32, ByVal x As Int32, ByVal y As Int32) As Int32
Private Sub Form1_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles Me.MouseDown
Dim pixelColor As Color
Using gr As Graphics = Graphics.FromHwnd(Me.Handle)
pixelColor = ColorTranslator.FromWin32(GetPixel(CInt(gr.GetHdc()), CInt(e.X), CInt(e.Y)))
End Using
Dim r As Byte = (pixelColor.R)
Dim g As Byte = (pixelColor.G)
Dim b As Byte = (pixelColor.B)
Dim text As String = _
String.Format("red: {0}, green: {1}, blue: {2}", New Object() {r, g, b})
MsgBox(text) 'code RGB
End Sub

J'ai testé les valeurs sur un échantillonneur, c'est parfait

Bon WE à tous
0
Cluny265 Messages postés 7 Date d'inscription samedi 14 avril 2012 Statut Membre Dernière intervention 12 décembre 2013
8 déc. 2013 à 11:54
A l'attention de cs_Le Pivert
Bonjour
-ton petit programme me convient parfaitement et répond à la question. Merci
- J'ai essayé de travailler la référence
http://codes-sources.commentcamarche.net/source/48207-controles-color-picker-wheel-color-picker-screen-color-picker
J'ai beaucoup pataugé sans résultat. Dommage mais ce travail ne correspondait qu'à une curiosité tutorielle.
Une remarque, la référence citée par Willi
(http://msdn.microsoft.com/en-us/magazine/cc164113.aspx)
n'est plus accessible.

A +
0
Rejoignez-nous