0

我正在尝试用 Java 制作编码器/解码器,这样我就可以以十六进制格式存储 RGB 值。我有这样的编码器:

System.out.println("#" + Integer.toHexString(label.getColor().getRed())
    + Integer.toHexString(label.getColor().getGreen())
    + Integer.toHexString(label.getColor().getBlue()));

和这样的解码器:

System.out.println(decodeColor("#"
    + Integer.toHexString(label.getColor().getRed())
    + Integer.toHexString(label.getColor().getGreen())
    + Integer.toHexString(label.getColor().getBlue())));

功能的实现decodeColor()是:

private RGB decodeColor(String attribute) {
    Integer intval = Integer.decode(attribute);
    int i = intval.intValue();
    return new RGB((i >> 16) & 0xFF, (i >> 8) & 0xFF, i & 0xFF);
}

当我运行测试程序时,我得到这个输出:

  • 初始值是新的 RGB(15, 255, 45)

<\label ... color="#fff2d">...</label>

RGB {15, 255, 45}

  • 初始值为 RGB(15, 0, 45)

<\label ... color="#f02d">...</label>

RGB {0, 240, 45}

因此,在某些情况下它会返回正确的结果,但在其他情况下则完全搞砸了。这是为什么?

4

2 回答 2

3

因为#rrggbb 每个颜色分量总是需要 2 个十六进制数字。

String s = String.format("#%02x%02x%02x", c.getRed(), c.getGreen(), c.getBlue());

Color c = Color.decode(s);
于 2013-09-20T10:31:32.143 回答
0
Integer intval = Integer.decode(attribute);

在这里,字符串attribute以 a 开头#,但它应该以 开头0x

private RGB decodeColor(String attribute) {
    String hexValue = attribute.replace("#", "0x");

    int i = Integer.decode(hexValue).intValue();
    return new RGB((i >> 16) & 0xFF, (i >> 8) & 0xFF, i & 0xFF);
}
于 2013-09-20T10:34:08.830 回答