【问题标题】:Java color opacityJava 颜色不透明度
【发布时间】:2011-10-06 15:00:03
【问题描述】:

我有一种方法可以根据某个值确定颜色。方法是这样的:

public Color color(double val) {
    double H = val * 0.3; 
    double S = 0.9; 
    double B = 0.9; 
    return Color.getHSBColor((float)H, (float)S, (float)B);
}

我还想让创建的颜色透明。我怎样才能做到这一点? 谢谢

【问题讨论】:

    标签: java colors transparency opacity


    【解决方案1】:

    使用Color constructor,它采用带有 Alpha 通道的值。具体来说,首先将颜色坐标转换为 RGB 空间:

    int rgba = Color.HSBtoRGB(H, S, B);
    

    然后添加所需的透明度,

    rgba = (rgba & 0xffffff) | (alpha << 24);
    

    其中alpha 是介于 0(完全透明)和 255(完全不透明)之间的整数,包括 0。您可以将此值传递给Color 构造函数,确保为第二个参数提供true

    Color c = new Color(rgba, true);
    

    【讨论】:

    • 谢谢,但是什么是 rgba |= alpha
    • 我刚刚意识到我误读了文档。我已经相应地编辑了我的答案。无论如何:您传递给颜色构造函数的参数将四个字节组合成一个整数:蓝色、绿色、红色和 alpha(透明度),按此顺序。 HSBtoRGB 方法为您提供了一个整数,其中红色、绿色和蓝色字节为您想要的颜色正确设置,但透明度字节将为零(完全透明)。要制作部分透明的颜色,您需要将最后一个字节设置为所需的透明度。 alpha &amp; 0xff 这样做。
    • (续)实际上,更准确地说:alpha &amp; 0xff 获取所需的透明度,然后将除最后 8 位之外的所有内容归零,rgba |= ... 使用 OR 运算来放置这些位成整数。对于我最初的(不正确的)代码,&lt;&lt; 24 将最后 8 位向左移动 24 位,使它们成为前 8 位,然后rgba |= ... 再次将这些位 OR 到整数中。跨度>
    • 假设 alpha 是 0..255 中的 int,我认为您的原始代码是正确的,将 alpha 放入高位字节:rgba |= alpha&lt;&lt;24。您的新版本将 alpha 放入低位字节,这是不对的。 docs.oracle.com/en/java/javase/11/docs/api/java.desktop/java/…
    • 嗯,谢谢。让我测试它以确认,然后我将相应地进行编辑。
    【解决方案2】:

    最简单的方法是直接指定 R、G、B 和 A,使用这个构造函数:

    public Color(float r, float g, float b, float a).

    我知道你有 HSB,但你可以很容易地convert to RGB

    【讨论】:

      【解决方案3】:

      我知道这是旧的,但是当我想要使用 Java 内置图形对象制作不透明度时,我所做的只是new Color(RRR, GGG, BBB, AAA)

      在上下文中使用:

      g.setColor(new Color(255, 255, 255, 80));
      

      最后一个值为 Alpha 通道/不透明度,数字越大表示不透明性越小。

      【讨论】:

      • 该方法的一部分在 jpo 的答案中进行了说明,但到目前为止,您的方法是唯一提供有关 alpha 值的较高/较低值的关键信息的方法。我因此投了赞成票,但后来意识到这是不正确的:更大的 alpha 值意味着颜色更不透明。我希望你能解决这个问题。
      • 数字越大越不透明。
      【解决方案4】:
      public Color color(double val) {
          double H = val * 0.3; 
          double S = 0.9; 
          double B = 0.9; 
          int rgb = Color.HSBtoRGB((float)H, (float)S, (float)B);
          int red = (rgb >> 16) & 0xFF;
          int green = (rgb >> 8) & 0xFF;
          int blue = rgb & 0xFF;
          Color color = new Color(red, green, blue, 0x33);
          return color;
      }
      

      【讨论】:

        猜你喜欢
        • 2016-04-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        • 2013-02-05
        • 1970-01-01
        • 2021-07-26
        相关资源
        最近更新 更多