Adapter couleur de fond NSView en fonction du contenu
fleurantin
Membre
J'affiche mon style de trait courant dans une NSView avec son épaisseur, son pointillé et sa couleur sur un fond blanc.
C'est chouette mais absolument horrible lorsque la couleur est claire (jaune, gris pale etc).
Existe t'il une solution pour passer le fond en noir ou gris sombre lorsque la couleur du trait est claire ?
Ceci est lisible
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Matt Gemmell a fait un exemple pour les labels, c'est le même principe
voir http://mattgemmell.com/nscolorcontrastinglabelextensions/
D'autant que le niveau de gris d'une couleur RGB si on veut être strict n'est pas rigoureusement égal à la moyenne (R+G+B)/3 dû au facteur psycho-visuel de l'oeil humain qui ne perçoit pas le Rouge, le Vert et le Bleu avec la même intensité/luminosité...
Voici la méthode que j'utilise pour convertir une couleur en niveaux de gris en fonction de sa luminance :
La première formule (maintenant en commentaire) fonctionnait bien jusqu'à panther ou tiger, mais maintenant c'est la deuxième qui semble la plus exacte.
1) Pourquoi ne pas utiliser "colorWithCalibratedWhite:alpha:" plutôt que "colorWithCalibratedRed:green:blue:alpha:" ? Une raison particulière ?
2) Le fait que tu aies eu à changer la formule c'est sans doute parce que tu utilise des CalibratedColorSpaces et que le calibrage a changé entre avant et après Panther/Tiger, non ? Avec un DeviceColorSpace cela n'aurait sans doute pas été le cas ?
3) Et je repose ma question, pourquoi utiliser RGB et faire ensuite le calcul du grayScale soi-même ?! Pourquoi ne pas convertir la couleur dans l'espace NS[Calibrated|Device][White|Black]ColorSpace tout simplement ? (ce qui va convertir ta couleur en niveaux de gris normalement, ce que fait donc ta méthode sauf qu'on utilise les méthodes Cocoa existantes déjà faites pour ça) ?
Moi j'aurais bien tenté un truc comme ça :
Mais après j'ai pas testé, peut-être qu'il y a une subtilité qui fait que ça marche pas ou ne rend pas le résultat attendu ?
En exclusivité pour toi, voici le code complet:
Non, c'est pire.
Je veux bien imaginer que RGB(x,x,x) != White(x) car ce ne sont pas les mêmes ColorSpaces, mais j'avoue que j'ai du mal à bien capter pourquoi la valeur de greyScale que tu calcules (je reconnais les formules de conversions RGB/Grayscale qu'on trouve un peu partout) ne corresponde justement pas à la valeur à utiliser pour White(x)...
Je n'ai toujours pas la réponse de pourquoi faire le calcul soi-même plutôt qu'utiliser les méthodes de conversion de ColorSpace que fournit Cocoa pour le faire, il y a certainement une raison mais ça m'intrigue de savoir laquelle