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