2

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

有什么算法或公式可以使用吗?

现在我使用这种方法,但我认为结果与我使用 Adob​​e 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;
}
4

2 回答 2

1

java.awt.Color班级可以帮助解决这个问题。

于 2011-03-22T09:16:42.523 回答
1

我真的不明白你试图通过将两种色调相加来达到什么目的。

色调是一个角度,给出了您所代表的颜色的“色调”。如果您以度为单位考虑,则色调将在 [0, 360[ 范围内。此外,45 和 405 的值将代表相同的色调。

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


我如何在 Android(它没有颜色操作实用程序)上创建我自己的颜色类来存储颜色的两种表示(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();
  }

  // ...
}

对于颜色转换示例代码:

于 2011-03-22T09:18:48.683 回答