2010-01-27 25 views
18

Je cherche un moyen d'inverser NSColor valeurs arbitraires à l'exécution, et il ne semble pas y avoir de méthode intégrée pour le faire.Existe-t-il une méthode conventionnelle pour inverser les valeurs NSColor?

je vais utiliser une catégorie pour étendre NSColor comme suit:

NSColor * invertedColor = [someOtherColor inverted]; 

Voici le prototype de la méthode de la catégorie que j'utilise:

@implementation NSColor (MyCategories) 
- (NSColor *)inverted 
{ 
    NSColor * original = [self colorUsingColorSpaceName: 
         NSCalibratedRGBColorSpace]; 
    return ...? 
} 
@end 

Quelqu'un peut-il remplir les blancs? Cela ne doit pas nécessairement être parfait, mais j'aimerais que cela ait un sens. i.e. .:

  1. [[[NSColor someColor] inverted] inverted] se traduirait par une couleur très proche de la couleur originale

  2. [[NSColor whiteColor] inverted] serait très proche de [NSColor blackColor]

  3. couleurs inversées serait sur des côtés opposés de la color wheel. (Rouge vert &, jaune & violet, etc.)

La valeur alpha doit rester le même que le NSColor d'origine. Je cherche seulement à inverser la couleur , pas la transparence.

MISE À JOUR 3: (! Maintenant en couleur)

Il se trouve que l'aide d'un complementary color (une couleur avec une teinte loin de la teinte d'origine 180 °) est pas tout à fait assez, parce que le blanc et le noir n'a pas vraiment de valeur de teinte. A partir de la réponse fournie par phoebus, ce que je suis venu avec:

CGFloat hue = [original hueComponent]; 
if (hue >= 0.5) { hue -= 0.5; } else { hue += 0.5; } 
return [NSColor colorWithCalibratedHue:hue 
          saturation:[original saturationComponent] 
          brightness:(1.0 - [original brightnessComponent]) 
           alpha:[original alphaComponent]]; 

La teinte est encore tourné de 180 °, mais j'inverser également la composante de luminosité afin que les couleurs très sombres deviennent très lumineux (et vice versa). Cela prend soin des cas en noir et blanc, mais il inverse à peu près toutes les couleurs au noir (ce qui viole ma règle de double inversion). Voici les résultats:

color swatch #1 http://img29.imageshack.us/img29/8548/invert1.jpg

Maintenant, Peter Hosey's approach est beaucoup plus simple, et il produit de meilleurs résultats:

return [NSColor colorWithCalibratedRed:(1.0 - [original redComponent]) 
           green:(1.0 - [original greenComponent]) 
            blue:(1.0 - [original blueComponent]) 
           alpha:[original alphaComponent]]; 

color swatch #2 http://img29.imageshack.us/img29/1513/invert2.jpg

Répondre

21

Simple: Les composants sont tous de 0-1, donc soustrayez chaque composant de 1 pour obtenir la valeur du complément.

Exemples:

  • Rouge = 1, 0, 0; complément = 0, 1, 1 = cyan
  • Jaune = 1, 1, 0; complément = 0, 0, 1 = bleu
  • Blanc = 1, 1, 1; complément = 0, 0, 0 = noir
  • Orange foncé = 1, 0,25, 0; complément = 0, 0.75, 1 = bleu ciel

Comme vous pouvez le deviner, il s'agit d'une opération symétrique. Inverser l'inverse vous obtiendra exactement la couleur que vous avez commencé avec.

+0

Refusé d'être simple à ce sujet :) – phoebus

+0

Note: Pour le gris = 0.5, 0.5, 0.5; le complément est lui-même. – Pang

3

D'après ce que vous décrivez, il ressemble à ce que vous avez vraiment want est une fonction pour trouver le complément d'une couleur, pas son inverse. Inverser signifie quelque chose de différent dans ce contexte.

Here's a StackOverflow question regarding complements in JavaScript. Peut-être qu'une partie du code est adaptable?

Here est une information intéressante et potentiellement utile sur les différentes façons dont la couleur peut être travaillée dans les espaces de couleur Cocoa.De ce que cela ressemble ici, si vous pouvez utiliser l'espace colorimétrique HSV, alors le complément d'une couleur peut être trouvé en prenant simplement hue > 179 ? hue -= 180 : hue = += 180, puisque les teintes sont définies autour de la roue chromatique dans un cercle complet.

+0

Ce code Java semble prometteur. Je vais lui donner un tourbillon. –

+0

Et merci pour le point sur les couleurs complémentaires par rapport aux couleurs inversées. Je vais ajouter cela à la question. –

1

Voici quelques-uns oneliner avec setter personnalisé (alpha est pas inversée!):

-(void)setReverseFontColor:(UIColor *)reverseFontColor { 
    _reverseFontColor = [AppSingleStyle reversedColorFromOriginal:reverseFontColor]; 
} 

+(UIColor*)reversedColorFromOriginal:(UIColor*)originalColor { 
    return [UIColor colorWithRed:(1-CGColorGetComponents(originalColor.CGColor)[0]) green:(1-CGColorGetComponents(originalColor.CGColor)[1]) blue:(1-CGColorGetComponents(originalColor.CGColor)[2]) alpha:CGColorGetAlpha(originalColor.CGColor)]; 
} 
+0

vous pouvez envisager d'utiliser const CGFloat * cc = CGColorGetComponents (originalColor.CGColor); return [colorant UIColorRouge: (1-cc [0]) vert: (1-cc [1]) bleu: (1-cc [2]) alpha: CGColorGetAlpha (originalColor.CGColor)]; (pourquoi appeler une fonction 3 fois pour obtenir le même résultat?) – unsynchronized