如何在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;
}
答案 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]