我尝试用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;
}
答案 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();
}
// ...
}
对于颜色转换示例代码: