Couleurs complementaires

Résolu
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 - 8 mars 2012 à 00:44
 Utilisateur anonyme - 9 mars 2012 à 13:35
Bonjour,

Voila une question peut etre classique: je selectionne une couleur via ColorDialog associe a un Bouton.
Je voudrais que les couleurs BackColor et ForeColor du bouton soient complementaires.
J'arrive a quelquechose d'acceptable excepte pour le gris RGB(128,128,128) ou RGB(130,130,130)..., ce qui parait logique avec le code ci-dessous.

Existe-t-il une meilleure methode/strategie que celle-ci?

Par exemple (peut-etre interessant, mais long?):
- si RColor compris entre 100 et 128 alors cRColor = 255
- si RColor compris entre 128 et 150 alors cRColor = 0 ...

Private Sub BGButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BGButton.Click
        If MyBackColorDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim RColor As Integer = MyBackColorDialog.Color.R
            Dim GColor As Integer = MyBackColorDialog.Color.G
            Dim BColor As Integer = MyBackColorDialog.Color.B
            BGButton.BackColor = MyBackColorDialog.Color
            BGButton.Text = "R:" & RColor.ToString & " G:" & GColor.ToString & " B:" & BColor.ToString
            Dim cRColor As Integer = 255 - RColor
            Dim cGColor As Integer = 255 - GColor
            Dim cBColor As Integer = 255 - BColor
            BGButton.ForeColor = Color.FromArgb(cRColor + (cGColor * 256) + (cBColor * 256 * 256))
         End If
End Sub


Merci,
JLuc01

13 réponses

bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
8 mars 2012 à 10:11
Salut,

sans rentrer dans la philosophie de la diffraction voici ce que j'utilise:

MonObject.BackColor = RGB(Red, Green, Blue)
MonObject.ForeColor = RGB(255 - Red, 255 - Green, 255 - Blue)

A+
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 mars 2012 à 12:53
Ouais ...
Et moi, je peux te dire d'avance ceci :
S'il s'agit, comme je le pense, de rendre lisible ce qui est écrit sur un fond uni === >>
ce ne sera pas une seule expression conditionnelle qui suffira , à moins de décider d'écrire en blanc ou d'écrire en noir (en fonction de ce que le total des valeurs R,G,B est ou non inférieur à 127 * 3. Et encore ! même ainsi ===>> gros problèmes de lisibilité si proche de la "moyenne" .
Essaye (moi, je l'ai essayé il y a fort longtemps) et tu verras


____________________
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
3
Utilisateur anonyme
8 mars 2012 à 14:35
Je ne sais pas si ça peut t'aider, mais, pourquoi pas travailler uniquement avec les "Light" et "Dark"? Comme ça on est sur qu'il y aura toujours un contraste différent:
        
If Button1.BackColor = Color.LightGreen Then
            Button1.BackColor = Color.DarkGreen
            Button1.ForeColor = Color.LightGreen
        Else
            Button1.ForeColor = Color.DarkGreen
            Button1.BackColor = Color.LightGreen
        End If



Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
3
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
9 mars 2012 à 01:06
acive, c'est une idee interessante, mais le choix de la couleur vient d'un ColorDialog, donc cela peut etre tres varie.

En fait, j'ai opte pour la solution suivante: (Rien d'elegant, mais cela semble marcher)

Private Sub BGButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BGButton.Click
    If MyColorDialog.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim RColor As Integer = MyColorDialog.Color.R
            Dim GColor As Integer = MyColorDialog.Color.G
            Dim BColor As Integer = MyColorDialog.Color.B
            BGButton.BackColor = MyColorDialog.Color
            If RColor > 97 And RColor < 128 Then RColor = 255
            If RColor > 127 And RColor < 158 Then RColor = 0
            If GColor > 97 And GColor < 128 Then GColor = 255
            If GColor > 127 And GColor < 158 Then GColor = 0
            If BColor > 97 And BColor < 128 Then BColor = 255
            If BColor > 127 And BColor < 158 Then BColor = 0
            BGButton.ForeColor = Color.FromArgb(255 - RColor, 255 - GColor, 255 - BColor)
            BGButton.Text = "R:" & RColor.ToString & " G:" & GColor.ToString & " B:" & BColor.ToString
    End If
End Sub


Merci pour vos idees.
A+
JLuc01
3

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

Posez votre question
Utilisateur anonyme
8 mars 2012 à 01:06
Bonjour,

Je voudrais que les couleurs BackColor et ForeColor du bouton soient complémentaires

Tout dépend de la perception des couleurs de chacun, (et de ce que tu appelles "couleurs complémentaires") nous sommes tous différents, et encore plus chez les autres animaux, mais bien sur que tu ne développes pas un logiciel pour les serpents qui ne distinguent que deux ou trois couleurs.


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
8 mars 2012 à 07:12
Bonjour,
On ne peut faire valablement de tels calculs que dans une logique fondamentale de couleurs primaires (Rouge, Jaune, Bleu pour simplifier) et non de RGB (où G est déjà une couleur complémentaire).
En rappelant les fondements :
CYMK = couleurs primaires (3) en synthèse soustractive
RGB = synthèse additive.

Oublier alors RGB et transposer d'abord en CYMK
Même en CYMK, le résultat ne sera pas parfait (du point de vue d'un peintre), du seul fait du noir (K key noir) qui, pour un peintre, n'est pas une couleur en soi, mais l'une des couleurs portée à son intensité extrême. Il n'y a pas "un" noir, mais "des" noirs. Et la couleur complémentaire d'un noir ne saurait être un blanc.


____________________
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
8 mars 2012 à 10:19
Bonjour, bigfish_le_vrai,
"diffraction" ?
Tu ne veux pas dire couleurs contrastées, plutôt ?
Et quid si tu as un fond RGB(128,128,128) ? ===>> gris sur gris ? ce sera lisible ?


____________________
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
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
8 mars 2012 à 11:45
pourquoi diffraction ?

ce n'est qu'un exemple des raisons pour les qu'elles il ne faut pas confondre : notion perceptive et longueur d'onde.

La perception de la longueur d'onde en cas d’interférence ou de diffraction dépend entre autres de la position de l'observateur.

La "diffraction" n'est pour le sujet présent, qu'un argument de la difficulté que pose la perception.

Et quid si tu as un fond RGB(128,128,128) ? ===>> gris sur gris ? ce sera lisible ?


Il est heureux qu'une condition "if" puisse nous sortir de ce mauvais pas ! ha la la que d’émotions !

A+
0
cs_JLuc01 Messages postés 206 Date d'inscription samedi 17 janvier 2009 Statut Membre Dernière intervention 5 mars 2013 1
8 mars 2012 à 14:06
Merci de l'interet pour cette question!

acive: Mon but est simplement de pouvoir lire le Text sur le Bouton (comme le dis ucfoutu), meme si la lisibilite n'est pas maximale. Le terme couleur complementaire est peut-etre mal choisi.

bigfish_le_vrai, je fais actuellement la meme chose, mais d'une maniere plus compliquee. Pourquoi faire simple quand on peut faire complique!
Comme le dis ucfoutu, le gris pose probleme. Je dois donc considerer des conditions IF...THEN...ELSE...

En bref, il n'y a rien de bien simple.
S'il y a d'autres idees ou suggestions, je suis preneur.

Merci encore,
JLuc01
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
9 mars 2012 à 08:00
rien, dans ce domaine, ne sera jamais parfait !
Je te livre ce que j'ai adopté, personnellement :
Je passe par l'écart de chaque composante par rapport à la somme des composantes.
Voici la méthode, sous VB6 (à corriger pour VB.Net)

Dim r As Integer, g As Integer, b As Integer, moy As Double
r = 255
g = 90
b = 205
Label1.BackColor = RGB(r, g, b)
moy = ((r + g + b) / 3) + 1
r = dudule(r, moy)
g = dudule(g, moy)
b = dudule(b, moy)
 Label1.ForeColor = RGB(r, g, b)


Private Function dudule(cl As Integer, moy As Double) As Integer
  If Abs(cl - moy) / moy <= 30 / 100 Then
     If cl <200 Then dudule 255 Else dudule = 0
  End If
End Function



____________________
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
9 mars 2012 à 09:44
Le mieux, d'ailleurs, est encore de laisser le choix à l'utilisateur.
Car je devine bien que tu veux lui permettre de personnaliser. Raison pour laquelle tu lui offres une boîte de dialogue pour le choix de la couleur de fond. Fais-en autant pour le ForeColor, de sorte à ce qu'il puisse ainsi choisir en meilleure connaissance de cause et en fonction de ses propres "perceptions" et réactions. Un peu comme le fait Word (lorsque l'on a à choisir) ===>> un "aperçu" du résultat dans une petite fenêtre.


____________________
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
Utilisateur anonyme
9 mars 2012 à 13:26
Oui, ou encore les choisir toi même d'avance.
C'est à dire que tu va déterminer d'avance quelle sera la couleur "complémentaire" (ce sera que ton avis)

Télécharge (en vb.net 2010) la [www.guadeloupe.camoes.com/PaletteCouleur.zip PALLETTE DES COULEURS]
Puis visuellement selon ton avis tu décides quelle sera la complémentaire (pour les 150 plus utilisées):
        'Déclaration des 150 couleurs complémentaires
        Dim Couleur(150) As Color
        Dim Complém(150) As Color
        Couleur(0) Color.Transparent : Complém(0) Color.Black
        Couleur(1) Color.AliceBlue : Complém(1) Color.DarkBlue
        Couleur(2) Color.AntiqueWhite : Complém(2) Color.Fuchsia
        Couleur(3) Color.Aqua : Complém(3) Color.DarkBlue
        '......... etc .......
        Couleur(149) Color.YellowGreen : Complém(149) Color.DarkGreen

        'Utilisation:
        For i As Integer = 0 To 149
            If Button1.BackColor = Couleur(i) Then
                Button1.ForeColor = Complém(i)
                Exit For
            End If
        Next


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Utilisateur anonyme
9 mars 2012 à 13:35
Mais...
Les goûts et les couleurs ça ne se discute pas.
Chacun a son avis, ce qui va te paraître logique à toi, ce n'est pas forcément l'avis de tout le monde.

Donc ce ne sera jamais parfait.


Cordialement


CF2i - Guadeloupe
Ingénierie Informatique
0
Rejoignez-nous