2010-04-07 4 views
1

Disons que j'ai la couleur FF0000, qui est rouge. Trouver une couleur plus foncée est facile, je tape juste CC au lieu de FF, mais disons que j'ai la couleur AE83FC, qui est une couleur compliquée, comment diable trouverais-je une version plus claire ou plus sombre automatiquement?Objective-C RGB à HSB

je me suis dit la manière facile de le faire est de convertir mon RGB à HSB [Teinte, Saturation, Luminosité]

Comment puis-je faire en Objective-C?

Disons que j'ai un RGB qui est: 1.0, 0.0, 0.0. C'est rouge.

CGFloat r = 1.0; 
CGFloat g = 0.0; 
CGfloat b = 0.0; 

Comment puis-je convertir en HSB puis transformer les couleurs et le faire revenir à RGB je peux utiliser CGContextRGBSetFillColor?

Existe-t-il des fonctions HSB?

Aidez-nous s'il vous plaît. :)

Répondre

4

D'abord, s'il vous plaît soyez conscient que trois nombres ne décrivent pas une couleur, trois nombres avec un espace de couleurs font. RVB n'est pas un espace de couleurs, c'est ce qu'on appelle un modèle de couleur. Il y a beaucoup d'espaces de couleurs avec le modèle RGB. Donc ((1,0,0), sRGB) est une couleur différente de ((1,0,0), Adobe RGB). Savez-vous comment les encodages de chaînes fonctionnent, où un groupe d'octets n'est pas une chaîne? C'est beaucoup comme ça. C'est également similaire en ce sens que vous êtes en quelque sorte en train de demander des problèmes quand vous voulez regarder les valeurs des composants, parce que c'est une occasion de gâcher la gestion de l'espace de couleurs.

Désolé, je ne peux pas m'en empêcher. Quoi qu'il en soit, je vais répondre à la question comme si votre couleur d'origine était ((1,0,0), RGB générique).

NSColor *color = [NSColor colorWithCalibratedRed:1 green:0 blue:0 alpha:1]; 
NSLog(@"hue! %g saturation! %g brightness! %g, [color hueComponent], [color saturationComponent], [color brightnessComponent]); 

et d'autre part,

NSColor *color = [NSColor colorWithCalibratedHue:h saturation:s brightness:b alpha:1]; 
NSLog(@"red! %g green! %g blue! %g, [color redComponent], [color greenComponent], [color blueComponent]); 

Ces méthodes de fooComponent ne fonctionnent pas avec toutes les couleurs, seuls les deux spécifiques colorimétriques, voir docs. Vous savez déjà que vous êtes bon si vous avez créé les couleurs vous-même avec les méthodes ci-dessus. Si vous avez une couleur de provenance inconnue, vous pouvez (tenter de) la convertir en un espace de couleurs dans lequel vous pouvez utiliser ces méthodes de composant avec -[NSColor colorUsingColorspaceName:].

+0

Ahh, c'est bien. :) Merci beaucoup l'homme. Je suppose que tout l'Adobe RGB et sRGB ne sera pas un gros problème puisque l'iPhone utilise un type de couleur spécifique? –

0

Pour cela, il n'est pas nécessaire d'aller jusqu'à HSB. Si vous voulez trouver une version plus foncée d'une couleur, il suffit de multiplier chaque composant R, G et B par un nombre entre 0 et 1, et vous obtiendrez la même couleur, mais plus sombre.

Exemple: demi-intensité de AE83FC:

{0xAE, 0x83, 0xFC} * 0.5 = 
    {174, 131, 252} * 0.5 = 
    {87, 65, 126} = 
    {0x57, 0x41, 0x7E} => 57417E 

De la même façon, vous pouvez obtenir des versions plus claires en multipliant avec quoi que ce soit> 1. La valeur de chaque composant ne peut pas être supérieure à 255, alors quand cela arrive, vous devez le limiter à 255. Cela signifie que la couleur ne sera pas exactement une version plus claire de la même couleur, mais probablement assez proche pour vos besoins.

+0

Belle méthode! Je n'ai jamais pensé à ça comme ça :) –

+0

Ceci est une approximation très grossière et aura tendance à vous donner une dérive de couleur visible dans tous, mais le plus limité des cas – Cruachan