如何以编程方式将Hue添加到给定颜色?

时间:2011-03-22 09:07:18

标签: java colors rgb hsv

我尝试用Java实现我的颜色编辑器。它应该是一个简单的软件。用户将以十六进制RGB输入颜色,例如:0xFF00FF。我知道如何计算色调,色度,饱和度和亮度,但是如何将Hue值添加或减去这个给定的颜色?这是个谜。

是否有任何算法或公式可供使用?

现在我使用这种方法,但我认为结果与Adobe Photoshop的结果不同。

public void addHue(float addHue) {
    float c = getChroma();
    addHue %= 6;
    if (addHue < 2) {
        float n = 1 - green;
        green = green + addHue * n;
    } else if (addHue < 4) {
        addHue -= 2;
        float n = 1 - blue;
        blue = blue + addHue * n;
    } else if (addHue < 6) {
        addHue -=4;
        float n = 1 - red;
        red = red + addHue * n;
    }
    if (green > 1) green = 1;
    else if (green < 0) green = 0;
    if (red > 1) red = 1;
    else if (red < 0) red = 0;
    if (blue > 1) blue = 1;
    else if (blue < 0) blue = 0;
}

2 个答案:

答案 0 :(得分:1)

java.awt.Color课程可以帮助解决这个问题。

答案 1 :(得分:1)

我真的不明白你想要通过添加两个色调来实现的目标。

Hue是一个角度,给出了您所代表颜色的“色调”。如果你认为是度数,色调将在[0,360 [范围。此外,45和405的值将代表相同的色调。

当你想操纵色调时,你必须考虑到这一点。也就是说,你想平均两个值,例如355和5,正确的结果可能是0(画一个圆并取这两个值之间的最小半角)或180(最大的半角)。


我是如何在Android(没有Color操作实用程序)上做的,是创建我自己的颜色类,它存储颜色的表示(rgb和hsv)。

然后我有方法允许设置RGB或设置HSV。添加相同的颜色空间是微不足道的。然后每次调用这些方法时,我都会分别调用updateHSV或updateRGB方法来计算新值中的颜色分量。

class Color {
  float[] hsv;
  float[] rgb;

  public void setRgb(float[] rgb) {
    System.arraycopy(rgb, 0, this.rgb, 0, 3);
    computeHsvFromRgb();
  }

  public void setHsv(float[] hsv) {
    System.arraycopy(hsv, 0, this.hsv, 0, 3);
    computeRgbFromHsv();
  }

  // ...
}

对于颜色转换示例代码: