我正在尝试编写函数,它可以根据给定的值在两种颜色之间生成颜色。一个例子可以更好地解释它..
输入..
X : 1
Y : 0.5
Z : 0
用户提供任意一组color:value
对,然后输入一个数字(比如0.75)。然后我必须生成颜色,它是Y和Z的比例混合(基于它们的值和输入值)。我在考虑以下方法。
我完全迷失了,如何生成颜色,是否有任何库。
更新: 这是我正在开展的更大项目的一部分。可以说我们有......
1 : X
0 : Y
和用户输入,0.25
我想要一些东西..
(X*0.25 + Y*0.75)
因为它更靠近Y,这就是为什么更高的比例。如果用户输入,0.5 ..输出应为
(X*0.5 + Y*0.5)
等等。我不知道如何用RGB颜色做到这一点。
P.S:这些问题不是针对语言的,而是我用Java做的。
答案 0 :(得分:5)
你必须分别混合每个颜色通道(红色,绿色和蓝色):
Color x,y; //set by you
float blending;//set by you
float inverse_blending = 1 - blending;
float red = x.getRed() * blending + y.getRed() * inverse_blending;
float green = x.getGreen() * blending + y.getGreen() * inverse_blending;
float blue = x.getBlue() * blending + y.getBlue() * inverse_blending;
//note that if i pass float values they have to be in the range of 0.0-1.0
//and not in 0-255 like the ones i get returned by the getters.
Color blended = new Color (red / 255, green / 255, blue / 255);
到目前为止的颜色示例。通常,如果要在两个值之间进行线性插值,则必须执行以下操作:
var firstValue;
var secondValue;
var interpolation;
var interpolated = firstValue * interpolation +
secondValue * (1 - interpolation);
但是由于你的情况是Color-Objects
,你不能一步插入整个对象,你必须自己插入每个相关的值。最后你必须插入alpha-channel
,不知道,因为你没有提到它,但为了完整性我把它包含在这个答案中。
答案 1 :(得分:4)
颜色是三维空间中的一个点。使用的确切坐标取决于所谓的“颜色空间”,其中有几种:RGB,HSV等。因此,要计算两种给定颜色之间的颜色,请在同一颜色空间中获取这两种颜色,并在它们之间的三维空间中计算这两种颜色之间的第三个点。
最简单的方法是简单地对颜色空间的三个值(例如R,G和B)中的每一个进行线性插值。但是更复杂的是坐标值通常不是线性的,所以你必须先将它们线性化(例如,电视颜色是指数,λ约为2.2)。根据您的应用程序,错误地假设线性可能仍然可以正常工作,尤其是如果起始颜色已经接近。
(如luk2302所述,如果需要,为alpha添加第四个坐标)。
答案 2 :(得分:2)
您可以通过执行以下操作来使用Java.awt.color:
public Color mixColors(Color color1, Color color2, double percent){
double inverse_percent = 1.0 - percent;
int redPart = (int) (color1.getRed()*percent + color2.getRed()*inverse_percent);
int greenPart = (int) (color1.getGreen()*percent + color2.getGreen()*inverse_percent);
int bluePart = (int) (color1.getBlue()*percent + color2.getBlue()*inverse_percent);
return new Color(redPart, greenPart, bluePart);
}