3

如何在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;

}
4

2 回答 2

7

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

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:确定文本颜色是否会与背景融为一体?

于 2013-05-01T05:16:39.373 回答
2

我知道这是一个老问题,但现在有一个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));
    }

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

根据维基百科

一个更具感知相关性的替代方法是使用亮度 Y' 作为亮度维度(图 12d)。亮度是伽马校正的 R、G 和 B 的加权平均值,基于它们对感知亮度的贡献,长期以来用作彩色电视广播中的单色维度。对于 sRGB,Rec. 709 原色产生 Y'709,数字 NTSC 根据 Rec. 使用 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]
于 2020-04-03T20:27:45.387 回答