2009-05-17 109 views
3

讓我們考慮以下情形:可以從白到紅生成代碼顏色的功能,從白色變成藍色,從白色到粉紅色,從白色到橙色等顏色生成功能

的顏色代碼是RGB格式,值爲0到255.

任何想法?你能給我的僞代碼或鏈接到這樣的算法?

+0

什麼語言?只需google RGB! – Dario 2009-05-17 19:16:59

+0

要查找橙色,粉紅色等的RGB值,請使用Google for'RGB色輪'。 – ChrisW 2009-05-17 19:24:08

+0

從一種顏色到另一種顏色的混合通常稱爲漸變。 – 2009-06-23 02:10:19

回答

12

聽起來好像你是在linear interpolation之後 - 在你的情況下,從白色插值到指定的顏色。例如,在C#:

public IEnumerable<Color> Interpolate(Color from, Color to, int steps) 
{ 
    int range = steps-1; // Makes things a bit easier 
    for (int i=0; i < steps; i++) 
    { 
     // i is the proportion of the "to" colour to use. 
     // j is the proportion of the "from" colour to use. 

     int j = range - i; 
     int r = ((from.R * j) + (to.R * i))/range; 
     int g = ((from.G * j) + (to.G * i))/range; 
     int b = ((from.B * j) + (to.B * i))/range; 
     yield return new Color(r, g, b); 
    } 
} 

當然也有做它除了線性插值的其他方式,但是這可能是最簡單的。請注意,如果您有很多步驟或更大的值,這會變得棘手,因爲您需要考慮溢出的可能性。在這種情況下,你應該沒問題 - 你不可能想要超過256步,而最大值是255,所以你不會接近int的限制。

編輯:正如評論中指出的那樣,RGB可能不是使用線性插值的最佳域。您可能最好將從/到RGB值轉換爲HSL or HSV,並對這些進行插值。根據您的平臺,這可能很容易或很棘手。上一句中的維基百科鏈接給出了適當計算的公式,如果它們沒有提供給您的話。

0

你想改變什麼顏色?白到紅只是一種情況,以255 255 255開始,並且遞減第二次直到你有255 0 0.藍色將保持最後的值並遞減以0 0 255結束,等等

+0

那是對的......但是橙色,粉紅色......等等......這是我的問題 – 2009-05-17 19:19:50

3

算法:

  1. 查找白色
  2. 的RGB值查找其他顏色的RGB值(例如你提到紅色,藍色,粉色,橙色)
  3. 計算RGB值,其RGB分量算術的RGB之間兩個極端的組成部分

例如,如果一個極端是(0,0,0),另一個極端是(0,255,255),那麼這兩種顏色之間的中間值是(0,128,128)...並且該值是(0,0,0)的四分之一這兩個值之間的方式是(0,64,64)。

1

從您想要的兩種顏色開始漸變,並將它們分解爲R,G和B部分。

決定要淡入多少「步驟」。

將R,G和B部分之間的差值除以步驟數量。您現在對每種顏色都有「階差」。

循環執行每個步驟,併爲每次迭代添加一次差異到顏色值一次。舍入到整數最後你做的事情。

2

通過已知的特定點插值顏色通常用於構建繪製數據的配色方案。顯式插值公式的另一種選擇是選擇一種在其表示背後具有某種設計的顏色方案。這種方案的一個很好的來源是ColorBrewer

即使您需要內插,從設計良好的配色方案開始可以產生更多可用的結果。