【问题标题】:UIColor comparisonUI颜色对比
【发布时间】:2010-09-01 21:15:31
【问题描述】:

给定一个 UIColor,我需要确定它是“浅色”还是“深色”。如果我可以访问颜色的十六进制值,我可以检查它是否大于或小于某个阈值十六进制数,但似乎没有办法做到这一点。有没有?还是有其他方法可以检查 UIColor 的亮度值?

【问题讨论】:

    标签: objective-c ios macos uicolor


    【解决方案1】:

    您可以安装 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
    

    【讨论】:

    • 我就是这样做的,如果值(HSV 中的 V,也称为亮度)
    • 谢谢,这是完美的。我可以检查是否大于或小于 0.5,就像 progmr 建议的那样。
    • 截至 2011 年 6 月,链接到的类别已失效。类别名称是什么?任何独特的方法名称?这些可用于从其他来源搜索代码。
    【解决方案2】:

    [UIColor CGColor] 会给你一个 CGColorRef,你可以从那里做CGColorGetComponents 来获取各个组件。获得“亮度”值取决于您对亮度的定义。获取组件的平均值(在 RGB 颜色空间的情况下)可能是一个好的开始。

    【讨论】:

    • 我不会使用平均值,人眼是峰值响应的。使用最亮的 RGB 组件来测量亮度。 00FF00 看起来比 555555 亮,但它们的平均值相同。
    • 这不会很好 - 例如:颜色 rgb(108 11 11) 和 rgb(107 91 12) 实际上具有相同的亮度 (0.42) 但总和(以及平均值)是130 和 210。不是很接近。
    • 正如我所说,这在很大程度上取决于您如何定义“亮度”。人眼并不是唯一可能的测量设备。
    【解决方案3】:

    UIColor(和 CGColorRef)通常以 RGB 值描述。如果您想确定亮或暗,您可能需要将这些值转换为色相/饱和度/亮度之类的值。但是没有您想要的内置函数。

    【讨论】:

      【解决方案4】:

      这里是关于 UIColor 扩展(使用类别)的指南(提供代码),并具有诸如 get hexStringFromColor 之类的方法:它应该是您正在寻找的。 UIColor expansion 注:这篇博客和代码不是我写的。

      【讨论】:

      • 这很好。 hexStringFromColor 给了我格式为“01f3df”的十六进制字符串。但我不知道如何将其转换为实际的十六进制数进行比较。
      • r g b 值无济于事,因为这个模型没有说明颜色的亮度。你可以告诉它的每一个组件,但不能一起告诉它们。
      【解决方案5】:

      计算颜色/颜色亮度差的建议算法:http://maestric.com/doc/color_brightness_difference_calculator (基于 w3c 论文)

      【讨论】:

        猜你喜欢
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 2011-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多