反转相反的颜色

Mar*_*nop 17 java android colors

我有一个用户设置,他们可以选择警报的颜色.警报是文本或按钮上的背景颜色.但问题在于,如果他们选择深蓝色并且我们有黑色字母,那么对比度就足够了,你无法阅读它.

我试图使功能得到反向相反的颜色,但没有太远.

有这样的功能吗?

Sar*_*fan 24

使用补色:

Algo很简单,从255减去每个颜色分量以获得新的颜色分量

Color textColor = Color.rgb(255-Color.red(bgColor),
                         255-Color.green(bgColor),
                         255-Color.blue(bgColor));
Run Code Online (Sandbox Code Playgroud)

-----编辑(基于RGB的补充可能无法正常工作--------

这两个链接非常有用,主题如下:

http://www.splitbrain.org/blog/2008-09/18-calculating_color_contrast_with_php

http://24ways.org/2010/calculating-color-contrast

  • 当用户选择颜色128/128/128(或非常接近的东西)时,这不是一个大问题. (7认同)

bri*_*ium 24

我发现对我来说最好的解决方案是将RGB值转换为YIQ值.由于我们只对亮度值(由Y表示)感兴趣,因此只需进行一次计算:Y = (299*R + 587*G + 114*B)/1000.它的Java代码如下所示:

public static Color getContrastColor(Color color) {
  double y = (299 * color.getRed() + 587 * color.getGreen() + 114 * color.getBlue()) / 1000;
  return y >= 128 ? Color.black : Color.white;
}
Run Code Online (Sandbox Code Playgroud)

根据原始颜色的亮度,您可以看到它只是决定使用黑色或白色.在我看来,结果非常好.权重(299,587,114)与眼睛的灵敏度(或视网膜的灵敏度)成对应于相应的颜色.

  • 为了使其在 Android 应用程序上运行,我对其进行了编辑: ``` private int getContrastColor(int color) { double y = (299 * Color.red(color) + 587 * Color.green(color) + 114 * Color.blue (颜色))/1000;返回 y >= 128 ?颜色.黑色 : 颜色.白色; }``` (2认同)

Sim*_*mon 9

根据Marks解决方案,我建议:

public static int getComplementaryColor(int colorToInvert) {
    float[] hsv = new float[3];
    Color.RGBToHSV(Color.red(colorToInvert), Color.green(colorToInvert),
            Color.blue(colorToInvert), hsv);
    hsv[0] = (hsv[0] + 180) % 360;
    return Color.HSVToColor(hsv);
}
Run Code Online (Sandbox Code Playgroud)

此外,我现在创建了一个类似的方法,用于计算给定颜色的默认背景:

public static int getContrastVersionForColor(int color) {
    float[] hsv = new float[3];
    Color.RGBToHSV(Color.red(color), Color.green(color), Color.blue(color),
            hsv);
    if (hsv[2] < 0.5) {
        hsv[2] = 0.7f;
    } else {
        hsv[2] = 0.3f;
    }
    hsv[1] = hsv[1] * 0.2f;
    return Color.HSVToColor(hsv);
}
Run Code Online (Sandbox Code Playgroud)

  • 你是什​​么意思它不起作用?你不喜欢这个结果?您能否提供一个看起来不正确的 color int 值?我经常使用它并且从未遇到过问题 (2认同)

Leo*_*tev 8

正如 Sarwar Erfan 指出的那样,使用互补色。为此,您可以使用整数掩码(这将比分别反转 R、G、B 颜色分量更快)。

int textColor = bgColor ^ 0x00ffffff;
Run Code Online (Sandbox Code Playgroud)


Mat*_*zen 0

您可以计算每个颜色通道(红色、绿色和蓝色)之间的差异,并获得平均差异 - 然后基于此进行一些比较。