我试图在java中的画布上进行颜色更改,以反映颜色呈现的值相对于彼此的强弱程度。
rgb颜色必须是不同色调的相同颜色,如白色到灰色到黑色,以及它们之间的每个阴影。考虑到我所代表的值变化很大,从-9999999到正9999999,如何更改rgb值。
答案 0 :(得分:4)
我认为你应该看看HSL/HSV而不是RGB。
虽然RGB本质上是基本的,因为它根据原色表示颜色,但它不允许您对R,G或B值进行“可理解的”更改以获得“相似”颜色。使用HSL / HSV模型,您将能够更改亮度/亮度/值(L / V)以获得具有不同灰度的颜色,或者更改色调(H)以获得整个光谱中的相似颜色。您可以从全亮度(白色)开始,通过减小L / V的值来创建更暗的灰色调,最终达到无亮度的颜色(黑色)。
非常温和的introduction to color theory, for developers is available here。
关于你的问题,你应该用HSL来表达你的颜色,随着饱和度值的增加,颜色范围从白色到黑色。当然,如果你想要白色和黑色之间没有任何其他颜色的灰色调,你应该将色调保持在最低限度。
下面是一个关于如何获得一系列颜色的简短示例。为简洁起见,我已将颜色填充到数组中,但这不是必需的,因为您可能想要立即使用颜色(除了考虑内存要求)。
private Color[] produceColorRange(int steps)
{
float value = 1.0f; //Starting with full brightness
Color[] colors = new Color[steps];
for(int ctr = 0; ctr < steps; ctr++)
{
value = value - (1.0f/steps); //tend to darkness
int rgb = Color.HSBtoRGB(0.7f, 0.0f, value); //create a darker color
//Hue is Blue, not noticeable
//because Saturation is 0
Color color = new Color(rgb);
colors[ctr] = color;
}
return colors;
}
如果你使用上面的方法并绘制一个JFrame,你将能够得到类似于下面的结果(除了我修改了色调和饱和度以获得我的颜色范围)。
请注意,如果您想要一种更简单的获取颜色范围的方法,请使用Color.WHITE初始化Color对象并调用color.darker()。当然,您将无法控制增量。
答案 1 :(得分:3)
是的,缩放您的值以适合您的域。这取决于RGB值的存储方式。通常,每个使用8位。由于灰色具有R = G = B,因此您希望将范围(-9999999,9999999)中的值缩放为(0,255)。
在第一个区间考虑x。由于第一个范围也包括负数,所以首先要做一个转变。
x = x + 9999999
现在x在区间(0,19999998)中。下一步是将其缩小到(0,255)。由于颜色值在该间隔内呈线性增长,因此您需要做的就是:
x = x * 255/19999998
现在x就在你想要的区间(0,255)中。
通常,如果您的初始值在区间(a,b)中并且想要将其转换为(0,c),则应用以下公式:(注意a可以是负数)
x =(x - a)* c /(b - a)
因此,如果你的R,G,B值是16位长,c将是2 ** 16 = 65536和公式:
x =(x + 9999999)* 65536/19999998
希望有所帮助。
答案 2 :(得分:0)
我不完全确定我理解你的问题,但是,如果我这样做:
为什么不将RGB值缩放到您范围内的值(从-9999999到正9999999)?此外,将R,G和B全部设置为相同的值,以便您使用灰色阴影来表示该值。
像这样:
private final int MIN = -9999999;
private final int MAX = 9999999;
public Color getScaledColor(int val) {
int gray = (int) Math.round((double) (val - MIN) / (double) (MAX - MIN)
* 255.0);
Color color = new Color(gray, gray, gray);
return color;
}
请注意,此解决方案不会为您指定的范围内的所有值提供唯一的颜色。但是请记住,人眼只能区分这么多的阴影(2 * 9999999 + 1可能比阴影的数量多,它可以区分)。
答案 3 :(得分:0)
HSL Color类实现上面提供的HSL / HSV维基百科链接中提供的公式。