我想我应该发布这个问题,即使我已经找到了解决方案,因为当我搜索它时 Java 实现并不容易获得。
使用 HSV 而不是 RGB 可以生成具有相同饱和度和亮度的颜色(这是我想要的)。
Google App Engine 不允许使用 java.awt.Color,所以执行以下操作在 HSV 和 RGB 之间转换不是一个选项:
Color c = Color.getHSBColor(hue, saturation, value);
String rgb = Integer.toHexString(c.getRGB());
编辑:我按照 Nick Johnson 的评论中的描述移动了我的答案。
Ex animo,- Alexander。
最佳答案
我对颜色数学一无所知,但我可以为代码提供这种替代结构,这让我很感兴趣,因为它让我明白 6 种情况中的每一种都是不同的值(value)排列, t和p。 (此外,我对长 if-else 链有一种非理性的恐惧。)
public static String hsvToRgb(float hue, float saturation, float value) {
int h = (int)(hue * 6);
float f = hue * 6 - h;
float p = value * (1 - saturation);
float q = value * (1 - f * saturation);
float t = value * (1 - (1 - f) * saturation);
switch (h) {
case 0: return rgbToString(value, t, p);
case 1: return rgbToString(q, value, p);
case 2: return rgbToString(p, value, t);
case 3: return rgbToString(p, q, value);
case 4: return rgbToString(t, p, value);
case 5: return rgbToString(value, p, q);
default: throw new RuntimeException("Something went wrong when converting from HSV to RGB. Input was " + hue + ", " + saturation + ", " + value);
}
}
public static String rgbToString(float r, float g, float b) {
String rs = Integer.toHexString((int)(r * 256));
String gs = Integer.toHexString((int)(g * 256));
String bs = Integer.toHexString((int)(b * 256));
return rs + gs + bs;
}
关于java - 在不使用 java.awt.Color 的情况下从 HSV(Java 中的 HSB)转换为 RGB(Google App Engine 不允许),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7896280/