yng*_*ing 10 java rgb google-app-engine colors hsv
我想我应该发布这个问题,即使我已经找到了解决方案,因为当我搜索它时,Java实现并不容易获得.
使用HSV代替RGB可以生成具有相同饱和度和亮度的颜色(我想要的东西).
Google App Engine不允许使用java.awt.Color,因此执行以下操作以在HSV和RGB之间进行转换不是一个选项:
Color c = Color.getHSBColor(hue, saturation, value);
String rgb = Integer.toHexString(c.getRGB());
Run Code Online (Sandbox Code Playgroud)
编辑:我按照尼克约翰逊的评论中的描述移动了我的答案.
前animo, - 亚历山大.
Pet*_*ore 16
我对颜色数学一无所知,但是我可以为代码提供这种替代结构,这让我的审美感觉更加刺激,因为它让我明白6个案例中的每一个是如何只是一个不同的价值排列,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;
}
Run Code Online (Sandbox Code Playgroud)
您应该使用Oracle提供的HSBtoRGB实现,将其源代码复制到您的项目中.java.awt.Color是开源的.Peter Recore和Yngling提供的算法不健全,并且对于某些输入将返回非法RGB值,如"256,256,0".Oracle的实现非常强大,而是使用它.
小智 5
使用ColorUtils提供
HSLToColor(float\[\] hsl)
Run Code Online (Sandbox Code Playgroud)
和
[RGBToHSL(int r, int g, int b, float\[\] hsl)]
Run Code Online (Sandbox Code Playgroud)
方法之间很容易相互转换!
例如:
float[] hsl = new float[]{1.5, 2.0, 1.5};
int color = ColorUtils.HSLToColor(hsl);
Run Code Online (Sandbox Code Playgroud)
现在获取颜色
float[] hslStub = new float[3];
float[] hslFromColor = ColorUtils.colorToHSL(color, hslStub);
Run Code Online (Sandbox Code Playgroud)
现在获取 hsl
这是源代码。