题
我在寻找一种方法来反转意 NSColor 值在运行时,并没有出现任何内在的方法这样做。
我将使用一个类别的扩展 NSColor
如下:
NSColor * invertedColor = [someOtherColor inverted];
这里是类别的方法的原型,我是使用:
@implementation NSColor (MyCategories)
- (NSColor *)inverted
{
NSColor * original = [self colorUsingColorSpaceName:
NSCalibratedRGBColorSpace];
return ...?
}
@end
任何人都可以填补空白?这并不是完美的,但我想它做一些有意义。即:
[[[NSColor someColor] inverted] inverted]
会导致一个颜色非常接近于原来的颜色[[NSColor whiteColor] inverted]
将会是非常接近[NSColor blackColor]
反转的色彩会上的相对侧面 颜色轮.(红色和绿色的、黄色和紫色,等等。)
Alpha值应保持原来的一样 NSColor
.我只是想要颠倒 颜色, 不该透明度。
更新3: (现在的颜色!)
事实证明,使用 互补颜色 (a颜色色180°远离原始色)是不够的,因为白色和黑色的真的没有一个顺化价值。从提供的答案 太阳神, 这是我想出了:
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]];
色调仍然是旋转180°,但我也反亮度件使得非常黑暗的颜色会变得非常明亮的(反之亦然)。这需要照顾的黑色和白色的情况,但它只是反对每一个颜色黑色的(这违反了我的双反规则)。这里是结果:
现在, 彼得Hosey的方法 简单得多,并可以产生更好的结果:
return [NSColor colorWithCalibratedRed:(1.0 - [original redComponent])
green:(1.0 - [original greenComponent])
blue:(1.0 - [original blueComponent])
alpha:[original alphaComponent]];
在迅速4.2:
extension NSColor {
func inverted() -> NSColor? {
return NSColor(calibratedRed: 1.0 - redComponent,
green: 1.0 - greenComponent,
blue: 1.0 - blueComponent,
alpha: alphaComponent)
}
}
解决方案
简单:该部件是所有0-1,因此减去每个成分从1至得到补充的价值。
实例:
- 红=1,0,0;补充=0,1,1=青
- 黄色=1,1,0;补充=0,0,1=蓝色的
- 白=1,1,1;补充=0,0,0=黑
- 深橙色=1,0.25,0;补充=0,0.75,1=蓝色的天空
你可以猜测,这是一个对称的操作。相反会让你 到底 颜色了。
其他提示
从你所描述的,这听起来像是你真正想要的是一个功能找到一个颜色的补充,而不是其逆。相意味着不同的东西在这一方面起到举足轻重的作用。
这里有一个计算器问题,关于补充在JavaScript.也许一些代码是可适应的?
在这里, 是一些有趣和潜在的有用信息的各种方式,颜色可以用在可可粉色的空间。从什么它看起来喜欢这里,如果可以使用的单纯疱疹病毒的颜色空间,则该补充的一种颜色可能会发现通过简单的 hue > 179 ? hue -= 180 : hue = += 180
, ,由于以色彩的定义是围绕颜色轮在一个完整的循环。
这里是一些oneliner定制定者(alpha不是颠倒!):
-(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)];
}