如何从UIColor获取反色?

例如黑色的反色应该是白色的。

的iOS5 +

-(UIColor*) inverseColor { CGFloat r,g,b,a; [self getRed:&r green:&g blue:&b alpha:&a]; return [UIColor colorWithRed:1.-r green:1.-g blue:1.-b alpha:a]; } 

这应该工作:

 // oldColor is the UIColor to invert const CGFloat *componentColors = CGColorGetComponents(oldColor.CGColor); UIColor *newColor = [[UIColor alloc] initWithRed:(1.0 - componentColors[0]) green:(1.0 - componentColors[1]) blue:(1.0 - componentColors[2]) alpha:componentColors[3]]; 

来源: 检查UIColor是否黑暗或明亮?

—-编辑—-

基于@ amleszk的回答,我用这种方法更新了UIColor类别:

 - (UIColor *)inverseColor { CGFloat alpha; CGFloat white; if ([self getWhite:&white alpha:&alpha]) { return [UIColor colorWithWhite:1.0 - white alpha:alpha]; } CGFloat hue, saturation, brightness; if ([self getHue:&hue saturation:&saturation brightness:&brightness alpha:&alpha]) { return [UIColor colorWithHue:1.0 - hue saturation:1.0 - saturation brightness:1.0 - brightness alpha:alpha]; } CGFloat red, green, blue; if ([self getRed:&red green:&green blue:&blue alpha:&alpha]) { return [UIColor colorWithRed:1.0 - red green:1.0 - green blue:1.0 - blue alpha:alpha]; } return nil; } 

—- D —- —-

根据@ grc的回答,我用这个方法创build一个UIColor类别:

 - (UIColor *)inverseColor { CGColorRef oldCGColor = self.CGColor; int numberOfComponents = CGColorGetNumberOfComponents(oldCGColor); // can not invert - the only component is the alpha // eg self == [UIColor groupTableViewBackgroundColor] if (numberOfComponents == 1) { return [UIColor colorWithCGColor:oldCGColor]; } const CGFloat *oldComponentColors = CGColorGetComponents(oldCGColor); CGFloat newComponentColors[numberOfComponents]; int i = numberOfComponents - 1; newComponentColors[i] = oldComponentColors[i]; // alpha while (--i >= 0) { newComponentColors[i] = 1 - oldComponentColors[i]; } CGColorRef newCGColor = CGColorCreate(CGColorGetColorSpace(oldCGColor), newComponentColors); UIColor *newColor = [UIColor colorWithCGColor:newCGColor]; CGColorRelease(newCGColor); return newColor; } 

迅速的方法是扩展UIColor:

 extension UIColor { func inverse () -> UIColor { var r:CGFloat = 0.0; var g:CGFloat = 0.0; var b:CGFloat = 0.0; var a:CGFloat = 0.0; if self.getRed(&r, green: &g, blue: &b, alpha: &a) { return UIColor(red: 1.0-r, green: 1.0 - g, blue: 1.0 - b, alpha: a) } return .black // Return a default colour } } 

GRC的解决scheme存在一个问题:CGColorGetComponents以0.0-1.0的比例返回,而不是从2-255返回。 所以你应该使用

 UIColor *newColor = [[UIColor alloc] initWithRed:(1.0 - componentColors[0]) green:(1.0 - componentColors[1]) blue:(1.0 - componentColors[2]) alpha:componentColors[3]]; 

代替。 否则一切都将是白色的(1.0和更大的)

与amleszk使用的一样,它也是1.颜色,而不是255.顺便说一下,1.表示浮点数1.0,您应该input1.0来代替1.,以避免混淆

你没有得到灰色反色。所以,当你使用灰背景和其反色作为文字的颜色

这工作,即使是灰色,我只是添加了一些额外的代码@iWills代码。

 //====== TO GET THE OPPOSIT COLORS ===== -(UIColor *)reverseColorOf :(UIColor *)oldColor { CGColorRef oldCGColor = oldColor.CGColor; int numberOfComponents = CGColorGetNumberOfComponents(oldCGColor); // can not invert - the only component is the alpha if (numberOfComponents == 1) { return [UIColor colorWithCGColor:oldCGColor]; } const CGFloat *oldComponentColors = CGColorGetComponents(oldCGColor); CGFloat newComponentColors[numberOfComponents]; int i = numberOfComponents - 1; newComponentColors[i] = oldComponentColors[i]; // alpha while (--i >= 0) { newComponentColors[i] = 1 - oldComponentColors[i]; } CGColorRef newCGColor = CGColorCreate(CGColorGetColorSpace(oldCGColor), newComponentColors); UIColor *newColor = [UIColor colorWithCGColor:newCGColor]; CGColorRelease(newCGColor); //=====For the GRAY colors 'Middle level colors' CGFloat white = 0; [oldColor getWhite:&white alpha:nil]; if(white>0.3 && white < 0.67) { if(white >= 0.5) newColor = [UIColor darkGrayColor]; else if (white < 0.5) newColor = [UIColor blackColor]; } return newColor; } 

所以为了帮助所有的快递员来到这里寻找答案 – 这是它应该如何迅速的样子:

 func inverseColor(color: UIColor) -> UIColor{ var a: CGFloat = 0.0; var r: CGFloat = 0.0; var g: CGFloat = 0.0; var b: CGFloat = 0.0; color.getRed(&r, green: &g, blue: &b, alpha: &a); return UIColor(red: -r, green: -g, blue: -b, alpha: a); } 

我用Dade的答案,并调整了一下,因为我正在寻找一个计算文本前景色的背景颜色的好方法。

所以如果你想为一个给定的背景颜色获得一个很好的文本颜色,我会build议你这样做。 它给你你给定的背景颜色最明亮的颜色:

 extension UIColor { func maxBright() -> UIColor { var r:CGFloat = 0.0; var g:CGFloat = 0.0; var b:CGFloat = 0.0; var a:CGFloat = 0.0; if self.getRed(&r, green: &g, blue: &b, alpha: &a) { let d:CGFloat = 1.0 - max(r,g,b) return UIColor(red: r + d, green: g + d , blue: b + d, alpha: 1.0) } return self } } 

它的作用就像滑动RGB滑块,直到最亮的组件达到最大。

例:

 titleLable.backgroundColor = UIColor.blackColor() titleLabel.textColor = titleLabel.backgroundColor?.maxBright() 

会给你一个白色的黑色标签。 尝试其他颜色,你会看到有趣的结果:)

这可能不是你正在寻找的,但它确实给文字前/后颜色有趣的结果。

只是分享

Interesting Posts