【发布时间】:2010-09-01 21:15:31
【问题描述】:
给定一个 UIColor,我需要确定它是“浅色”还是“深色”。如果我可以访问颜色的十六进制值,我可以检查它是否大于或小于某个阈值十六进制数,但似乎没有办法做到这一点。有没有?还是有其他方法可以检查 UIColor 的亮度值?
【问题讨论】:
标签: objective-c ios macos uicolor
给定一个 UIColor,我需要确定它是“浅色”还是“深色”。如果我可以访问颜色的十六进制值,我可以检查它是否大于或小于某个阈值十六进制数,但似乎没有办法做到这一点。有没有?还是有其他方法可以检查 UIColor 的亮度值?
【问题讨论】:
标签: objective-c ios macos uicolor
您可以安装 this Category 以扩展 UIColor 以了解 HSV/HSB 并比较 [aUIColor brightness]
编辑:
我在一些github-hosted project 中找到了相同的代码,大致了解一下:https://gist.github.com/1252197
#import "UIColor-HSVAdditions.h"
@implementation UIColor (UIColor_HSVAdditions)
+(struct hsv_color)HSVfromRGB:(struct rgb_color)rgb
{
struct hsv_color hsv;
CGFloat rgb_min, rgb_max;
rgb_min = MIN3(rgb.r, rgb.g, rgb.b);
rgb_max = MAX3(rgb.r, rgb.g, rgb.b);
hsv.val = rgb_max;
if (hsv.val == 0) {
hsv.hue = hsv.sat = 0;
return hsv;
}
rgb.r /= hsv.val;
rgb.g /= hsv.val;
rgb.b /= hsv.val;
rgb_min = MIN3(rgb.r, rgb.g, rgb.b);
rgb_max = MAX3(rgb.r, rgb.g, rgb.b);
hsv.sat = rgb_max - rgb_min;
if (hsv.sat == 0) {
hsv.hue = 0;
return hsv;
}
if (rgb_max == rgb.r) {
hsv.hue = 0.0 + 60.0*(rgb.g - rgb.b);
if (hsv.hue < 0.0) {
hsv.hue += 360.0;
}
} else if (rgb_max == rgb.g) {
hsv.hue = 120.0 + 60.0*(rgb.b - rgb.r);
} else /* rgb_max == rgb.b */ {
hsv.hue = 240.0 + 60.0*(rgb.r - rgb.g);
}
return hsv;
}
-(CGFloat)hue
{
struct hsv_color hsv;
struct rgb_color rgb;
rgb.r = [self red];
rgb.g = [self green];
rgb.b = [self blue];
hsv = [UIColor HSVfromRGB: rgb];
return (hsv.hue / 360.0);
}
-(CGFloat)saturation
{
struct hsv_color hsv;
struct rgb_color rgb;
rgb.r = [self red];
rgb.g = [self green];
rgb.b = [self blue];
hsv = [UIColor HSVfromRGB: rgb];
return hsv.sat;
}
-(CGFloat)brightness
{
struct hsv_color hsv;
struct rgb_color rgb;
rgb.r = [self red];
rgb.g = [self green];
rgb.b = [self blue];
hsv = [UIColor HSVfromRGB: rgb];
return hsv.val;
}
-(CGFloat)value
{
return [self brightness];
}
@end
【讨论】:
[UIColor CGColor] 会给你一个 CGColorRef,你可以从那里做CGColorGetComponents 来获取各个组件。获得“亮度”值取决于您对亮度的定义。获取组件的平均值(在 RGB 颜色空间的情况下)可能是一个好的开始。
【讨论】:
UIColor(和 CGColorRef)通常以 RGB 值描述。如果您想确定亮或暗,您可能需要将这些值转换为色相/饱和度/亮度之类的值。但是没有您想要的内置函数。
【讨论】:
这里是关于 UIColor 扩展(使用类别)的指南(提供代码),并具有诸如 get hexStringFromColor 之类的方法:它应该是您正在寻找的。 UIColor expansion 注:这篇博客和代码不是我写的。
【讨论】:
计算颜色/颜色亮度差的建议算法:http://maestric.com/doc/color_brightness_difference_calculator (基于 w3c 论文)
【讨论】: