如何在android中检查颜色亮度?

时间:2013-05-01 04:35:18

标签: android

如何在android中检查亮度?

我有一个整数颜色的颜色。我想根据颜色的整数值检查这种颜色是深色还是浅色。

if (checkColor == Color.RED || checkColor == Color.BLACK) {

    //set fore color is white

} else {

    //set fore color is black
}

而不是上面的代码,我想改变

if (!isBrightColor(checkColor)) {

    //set fore color is white

} else {

    //set fore color is black
}

private boolean isBrightColor(int checkColor){

    boolean rtnValue;

    //How to check this color is bright or dark

    return rtnValue;

}

2 个答案:

答案 0 :(得分:5)

你应该试试这个......

public static boolean isBrightColor(int color) {
    if (android.R.color.transparent == color)
        return true;

    boolean rtnValue = false;

    int[] rgb = { Color.red(color), Color.green(color), Color.blue(color) };

    int brightness = (int) Math.sqrt(rgb[0] * rgb[0] * .241 + rgb[1]
            * rgb[1] * .691 + rgb[2] * rgb[2] * .068);

    // color is light
    if (brightness >= 200) {
        rtnValue = true;           
    }

    return rtnValue;
}

参考: Android/Java: Determining if text color will blend in with the background?

答案 1 :(得分:1)

我知道这是一个古老的问题,但是现在有一个Color.luminance(int)已经按照选定的答案(API 24+)进行了提示

    /**
     * Returns the relative luminance of a color.
     * <p>
     * Assumes sRGB encoding. Based on the formula for relative luminance
     * defined in WCAG 2.0, W3C Recommendation 11 December 2008.
     *
     * @return a value between 0 (darkest black) and 1 (lightest white)
     */
    public static float luminance(@ColorInt int color) {
        ColorSpace.Rgb cs = (ColorSpace.Rgb) ColorSpace.get(ColorSpace.Named.SRGB);
        DoubleUnaryOperator eotf = cs.getEotf();

        double r = eotf.applyAsDouble(red(color) / 255.0);
        double g = eotf.applyAsDouble(green(color) / 255.0);
        double b = eotf.applyAsDouble(blue(color) / 255.0);

        return (float) ((0.2126 * r) + (0.7152 * g) + (0.0722 * b));
    }

亮度和亮度之间也有区别:

根据wikipedia

在感知上更相关的替代方法是使用亮度Y'作为亮度尺寸(图12d)。亮度是经过伽玛校正的R,G和B的加权平均值,基于它们对感知亮度的贡献,长期以来一直用作彩色电视广播中的单色尺寸。对于sRGB,建议709原色产生Y'709,数字NTSC根据Rec.70使用Y'601。 601和其他一些原语也正在使用,它们导致不同的系数。[26] [J]

Y 601 ′ = 0.2989 * R + 0.5870 * G + 0.1140 * B (SDTV)
Y 240 ′ = 0.212 * R + 0.701 * G + 0.087 * B (Adobe)
Y 709 ′ = 0.2126 * R + 0.7152 * G + 0.0722 * B (HDTV)
Y 2020 ′ = 0.2627 * R + 0.6780 * G + 0.0593 * B (UHDTV, HDR)

因此,您首先需要了解您想要的实际上是亮度(RGB上R,G和B之和的平均值)还是说明人眼感知的亮度。

为了完整起见,如果您想要实际的亮度,那将是颜色的HSV表示形式上的V值,因此可以使用:

        val hsv = FloatArray(3)
        Color.colorToHSV(color, hsv)
        val brightness = hsv[2]