我試圖在java中的畫布上進行顏色更改,以表示顏色重現的值相對於彼此的強弱程度。更改rgb顏色值以表示值
RGB顏色必須是相同的顏色,只是不同的色調,如從白色到灰色到黑色以及之間的每個灰色陰影。如何變更考慮,我代表的價值觀有很大的差異的RGB值,從-9999999正9999999
我試圖在java中的畫布上進行顏色更改,以表示顏色重現的值相對於彼此的強弱程度。更改rgb顏色值以表示值
RGB顏色必須是相同的顏色,只是不同的色調,如從白色到灰色到黑色以及之間的每個灰色陰影。如何變更考慮,我代表的價值觀有很大的差異的RGB值,從-9999999正9999999
是的,縮放您的值以適合您的域名。這取決於你的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
希望有所幫助。
我不能完全肯定我理解你的問題,但是,如果我這樣做:
爲什麼不把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可能比可以區分的色調數量多)。
我想你應該看看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.WHITE Color對象,並調用color.darker()。當然,你將無法控制增量。
HSL Color類實現上面提供的HSL/HSV維基百科鏈接中提供的公式。
這可能是你想要的。保羅的解決方案將工作,但只給你255個不同的灰色,並獲得更多的他們是最容易做在另一個色彩空間,如HSV – Mongoose 2009-09-14 21:32:12
偉大的,我在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