2009-09-14 206 views
1

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

RGB颜色必须是相同的颜色,只是不同的色调,如从白色到灰色到黑色以及之间的每个灰色阴影。如何变更考虑,我代表的价值观有很大的差异的RGB值,从-9999999正9999999

回答

3

是的,缩放您的值以适合您的域名。这取决于你的RGB值如何存储。通常每个使用8位。由于灰色具有R = G = B,因此您希望将范围(-9999999,9999999)中的值缩放为(0,255)。

考虑x在第一个区间。由于第一个范围也包含负数,因此首先进行转换。

X = X + 9999999

现在x是在区间(0,19999998)。下一步是将其缩小到(0,255)。由于颜色值在间隔呈线性增长的,所有你需要做的是这样的:

X = X *19999998分之255

现在x是就像你想的时间间隔(0,255)。

一般来说,如果inital值是在区间(A,B),并希望将其转化为(0,c)中,适用以下公式:(请注意,可以是负的)

X =( X - A)* C /(b - A)

所以如果R,G,b的值是16位长,C为2 ** 16 = 65536和下式:

X =( x + 9999999)* 65536/19999998

希望有所帮助。

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可能比可以区分的色调数量多)。

4

我想你应该看看HSL/HSV而不是RGB。

尽管RGB本质上是基本的,但它表达的是原色方面的颜色,它不允许您对R,G或B值进行“可理解的”更改以达到“相似”的颜色。使用HSL/HSV模型,您可以对亮度/亮度/数值(L/V)进行更改,以获得具有不同灰度量的颜色,或对Hue(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()。当然,你将无法控制增量。

+0

这可能是你想要的。保罗的解决方案将工作,但只给你255个不同的灰色,并获得更多的他们是最容易做在另一个色彩空间,如HSV – Mongoose 2009-09-14 21:32:12

+0

伟大的,我在JavaScript中使用它。对于转换,可以使用此库:http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript – 2011-08-28 00:38:07

0

HSL Color类实现上面提供的HSL/HSV维基百科链接中提供的公式。