如何编码和解码RGB到十六进制

时间:2013-09-20 10:18:48

标签: java hex rgb data-conversion

我正在尝试用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}

因此,在某些情况下,它会返回正确的结果,但在其他情况下,它会完全混乱。那是为什么?

2 个答案:

答案 0 :(得分:3)

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

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

Color c = Color.decode(s);

答案 1 :(得分:0)

Integer intval = Integer.decode(attribute);

此处,字符串attribute#开头,但应以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);
}