更改rgb颜色值以表示值

时间:2009-09-14 21:05:15

标签: java

我试图在java中的画布上进行颜色更改,以反映颜色呈现的值相对于彼此的强弱程度。

rgb颜色必须是不同色调的相同颜色,如白色到灰色到黑色,以及它们之间的每个阴影。考虑到我所代表的值变化很大,从-9999999到正9999999,如何更改rgb值。

4 个答案:

答案 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 Range screenshot

请注意,如果您想要一种更简单的获取颜色范围的方法,请使用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维基百科链接中提供的公式。