gpt4 book ai didi

java - 16 位转换的相对 8 位颜色

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:47:28 25 4
gpt4 key购买 nike

我正在开发一个 Java EE 应用程序,其中有一个包含一些产品的“项目”表,以及一个用于设置其颜色的字段。

问题:用户从包含 16 种或可能 128 种颜色的调色板中选择一种颜色。我将颜色存储为一个字节(8 位颜色),并且我需要能够将 RGB 颜色/整数转换为其等效的 8 位,反之亦然,例如:

White:  0xFF(0b 111 111 11) to -1     or (255,255,255)
Red: 0x10(0b 111 000 00) to -65536 or (255, 0, 0 )

到目前为止我尝试了什么:

void setColor(Color color){
short sColor = (color.getRGB() >> 16) & 0xFF) >> 8
| (color.getRGB() >> 8) & 0xFF) >> 8
| (color.getRGB() >> 0) & 0xFF) >> 8;
}

Color getColor(short sColor){
Color rgb = new Color(
/*red:*/ (sColor & 0xF) << 16,
/*gree:*/ (sColor & 0xF) << 8,
/*blue*/ (sColor & 0xF) << 0));
}
/* or */

Color getColor(short sColor){
Color rgb = new Color((sColor << 8) + sColor));
}

当我遍历 0 到 255 的颜色值时,我得到了单一的色调变化。

最佳答案

所以在 8 位颜色中:

111 111 11
red grn bl

?

红色和绿色有 8 个不同的值:

0 (0)
1 (36)
2 (72)
3 (109)
4 (145)
5 (182)
6 (218)
7 (255)

还有 4 个不同的蓝色值。

试试这个:

public static Color fromByte(byte b) {
int red = (int) Math.round(((b & 0xE0) >>> 5) / 7.0 * 255.0);
int green = (int) Math.round(((b & 0x1C) >>> 2) / 7.0 * 255.0);
int blue = (int) Math.round((b & 0x03) / 3.0 * 255.0);
return new Color(red, green, blue);
}

public static byte fromColor(Color color) {
int red = color.getRed();
int green = color.getGreen();
int blue = color.getBlue();

return (byte) (((int) Math.round(red / 255.0 * 7.0) << 5) |
((int) Math.round(green / 255.0 * 7.0) << 2) |
((int) Math.round(blue / 255.0 * 3.0)));
}

这里是可能的颜色 http://jsfiddle.net/e3TsR/

关于java - 16 位转换的相对 8 位颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14775442/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com