2009-09-14 160 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維基百科鏈接中提供的公式。