【问题标题】:Java Color(int rgba) constructor and int overflowJava Color(int rgba) 构造函数和 int 溢出
【发布时间】:2013-08-17 04:46:40
【问题描述】:

根据docs,存在这个构造函数:

public Color(int rgba,
         boolean hasalpha)

鉴于 java 没有无符号整数,我看不出如何使用它来创建 Color(255,255,255,255) 的等效项(例如 0xFFFFFFFF)。

如何将这个构造函数用于“大”颜色?

编辑

显然可以使用构造函数(惊喜),但是像这样解析 RGBa 颜色字符串会失败:

    int x = Integer.parseInt("0xFFFFFFFF", 16); // Number format error
    Color c = new Color(x, true);

解决方案似乎是使用 BigInteger 进行解析。抱歉,这个问题被误导了!

【问题讨论】:

    标签: java colors int awt


    【解决方案1】:

    去二进制。

    颜色 c = 新颜色(0b1111111111111111111111111111111, true);

    根据 Java 文档,“alpha 分量在 24-31 位,红色分量在 16-23 位,绿色分量在 8-15 位,蓝色分量在 0-7 位”

    【讨论】:

    • 0xFFFFFFFF 是完全相同的数字。并且二进制表示仅适用于 java 7 及更高版本。
    • 所以?文档解释了 aRGB 位的位置,因此这是一种简单的方法并使其清晰。不值得-1,因为答案是正确的,我只是使用 OP 链接的 Javadocs 的字面定义来强调这一点。
    • 我误解了您确实理解手头的问题,因为在我看来,您的回答并没有反映出来。如果您编辑答案以使这一点更清楚,我将能够删除我的反对票。
    • 别担心,我没有真正提供解释,所以您的担忧是可以理解的。我添加了一个关于我如何得到答案的简介。
    【解决方案2】:

    您的问题没有误导,但您似乎误解了Kon的回答:

    关于 Java 的 Integer 一直被签名是对的,但这并不意味着该数字中的信息位数较少。

    当您创建颜色时:

    new Color(255, 255, 255, 255)
    

    与使用相同:

    new Color(0xFFFFFFFF, true)
    

    或使用:

    new Color(0b11111111111111111111111111111111, true)
    

    0xFFFFFFFF 实际上是-1,但这并不意味着任何位都发生了变化;这只是代表的问题。 Color 只是删除了每个颜色分量的必要位。

    实际上,您可以使用以下方法创建所需的颜色:

    Color c = new Color(-1,true);
    System.out.println(c);
    System.out.println(c.getAlpha());
    

    产生:

    java.awt.Color[r=255,g=255,b=255]
    255
    

    【讨论】:

    • 有帮助,谢谢。我更多的困惑来自here 讨论的行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    相关资源
    最近更新 更多