Question

Je suis à la recherche d'un moyen d'inverser arbitraire les valeurs de NSColor lors de l'exécution, et il ne semble pas être une méthode intégrée pour le faire.

Je vais utiliser une catégorie d'é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 être parfait, mais je voudrais pour en faire un certain sens. i.e.:.

  1. [[[NSColor someColor] inverted] inverted] entraînerait une couleur très proche de la couleur d'origine

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

  3. couleurs seraient inversés sur les côtés opposés des . (Rouge et vert, jaune et violet, etc.)

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

Mise à jour 3: (! Maintenant en couleur)

Il se trouve que l'utilisation d'un complémentaire (une couleur avec une teinte à une distance de 180 ° de la teinte d'origine) est pas tout à fait assez, parce que le blanc et le noir ne vraiment pas avoir une 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 luminance de sorte que les couleurs très sombres deviennent très lumineux (et vice versa). Cela prend en charge des cas en noir et blanc, mais il intervertit à peu près toutes les couleurs au noir (ce qui porte atteinte à ma règle de la double inversion). Voici les résultats:

Maintenant, l'approche de Peter Hosey 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]];

Swift 4.2:

extension NSColor {

    func inverted() -> NSColor? {
        return NSColor(calibratedRed: 1.0 - redComponent,
                               green: 1.0 - greenComponent,
                               blue: 1.0 - blueComponent,
                               alpha: alphaComponent)
    }
} 
Était-ce utile?

La solution

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

.

Exemples:

  • Rouge = 1, 0, 0; compléter = 0, 1, 1 = cyan
  • Jaune = 1, 1, 0; compléter = 0, 0, 1 = bleu
  • Blanc = 1, 1, 1; compléter = 0, 0, 0 = noir
  • orange foncé = 1, 0,25, 0; compléter = 0, 0,75, 1 = bleu ciel

Comme vous pouvez le deviner, cette opération est symétrique. L'inverse va inverser vous obtenir exactement la couleur que vous avez commencé avec.

Autres conseils

D'après ce que vous décrivez, cela ressemble à ce que vous voulez vraiment est une fonction pour trouver le complément d'une couleur, et non son inverse. Inverting quelque chose de différent signifie dans ce contexte.

Voici une question StackOverflow en ce qui concerne les compléments en JavaScript . Peut-être une partie du code est adaptable?

est une informations intéressantes et potentiellement utiles sur les différentes façons de couleur peut être travaillé avec dans les espaces de couleur cacao. De quoi il ressemble ici, si vous pouvez utiliser l'espace couleur HSV, le complément d'une couleur pourrait être trouvée en prenant simplement hue > 179 ? hue -= 180 : hue = += 180, car les teintes sont définies autour de la roue de couleur dans un cercle complet.

Voici quelques 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)];
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top