Couleurs complementaires [Résolu]

cs_JLuc01 208 Messages postés samedi 17 janvier 2009Date d'inscription 5 mars 2013 Dernière intervention - 8 mars 2012 à 00:44 - Dernière réponse :  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
Afficher la suite 

Votre réponse

13 réponses

bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 8 mars 2012 à 10:11
+3
Utile
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+
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de bigfish_le vrai
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 8 mars 2012 à 12:53
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de ucfoutu
Utilisateur anonyme - 8 mars 2012 à 14:35
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Utilisateur anonyme
cs_JLuc01 208 Messages postés samedi 17 janvier 2009Date d'inscription 5 mars 2013 Dernière intervention - 9 mars 2012 à 01:06
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_JLuc01
Utilisateur anonyme - 8 mars 2012 à 01:06
0
Utile
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
Commenter la réponse de Utilisateur anonyme
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 8 mars 2012 à 07:12
0
Utile
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
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 8 mars 2012 à 10:19
0
Utile
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
Commenter la réponse de ucfoutu
bigfish_le vrai 1839 Messages postés vendredi 13 mai 2005Date d'inscription 20 novembre 2013 Dernière intervention - 8 mars 2012 à 11:45
0
Utile
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+
Commenter la réponse de bigfish_le vrai
cs_JLuc01 208 Messages postés samedi 17 janvier 2009Date d'inscription 5 mars 2013 Dernière intervention - 8 mars 2012 à 14:06
0
Utile
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
Commenter la réponse de cs_JLuc01
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 9 mars 2012 à 08:00
0
Utile
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
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 9 mars 2012 à 09:44
0
Utile
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
Commenter la réponse de ucfoutu
Utilisateur anonyme - 9 mars 2012 à 13:26
0
Utile
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
Commenter la réponse de Utilisateur anonyme
Utilisateur anonyme - 9 mars 2012 à 13:35
0
Utile
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
Commenter la réponse de Utilisateur anonyme

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.