在不使用java.awt.Color的情况下从HSV(Java中的HSB)转换为RGB(在Google App Engine上不允许)

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)

  • 抱歉拖了一个2岁的线程,但我想知道是否有人会为我确认一些东西 - 应该`rgbToString`乘以'255`,而不是'256`?因为否则,当`r`是'1.0`时,`rs`将是十六进制的'100`,这是错误的. (4认同)
  • 如果你的色调值正好是1,那么h很容易就是6,抛出一个不必要的异常. (3认同)

pie*_*era 5

您应该使用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

这是源代码