2013-03-27 90 views
3

我想根據數字intervals和位置(index)得到不同的灰色陰影。50級灰色

所以功能會是這樣的:

public static string GetShade(string StartColour, string EndColour, int Intervals, int Index) 
{ ... } 

因此,這將返回:

GetShade("#aaaaaa", "#eeeeee", 5, 2) = "#bbbbbb" 
GetShade("#333333", "#555555", 3, 3) = "#555555" 

(顯然,這隻會是相關的灰色,如果我開始&末是灰色)。

任何指針?

+1

試一試:剁碎顏色分爲它的R,G和B分量,計算差值,所述間隔劃分它,並添加導致'索引'次數到起始值。 – 2013-03-27 08:18:31

+0

是#ababab形式中的所有灰色陰影還是可以以任何形式出現? HSL將是一個更好的灰色模型。 – 2013-03-27 08:20:48

+0

@marabutt好點;但讓我們指出,這對於「純」灰度圖像不需要,其中R,G和B是相等的。不過,它需要爲棕褐色或其他色調... – 2013-03-27 08:23:02

回答

1

你需要一些特殊的字符串表示的事實應該放在你的函數之外。處理顏色是一項任務。格式化字符串的顏色是另一項任務,應由另一個函數處理。

的基本數學詳細闡述了這樣的:

 public static Color GetShade(Color start, Color end, byte intervals, byte index) 
     { 
     var deltaR = end.R - start.R; 
     var deltaG = end.G - start.G; 
     var deltaB = end.B - start.B; 

     var intervalR = deltaR/intervals; 
     var intervalG = deltaG/intervals; 
     var intervalB = deltaB/intervals; 

     var finalR = start.R + (index * intervalR); 
     var finalG = start.G + (index * intervalG); 
     var finalB = start.B + (index * intervalB); 

     return new Color { R = (byte)finalR, G = (byte)finalG, B = (byte)finalB }; 
     } 
+0

由於它的灰色R,B和B將是相同的值 – Rob 2013-03-27 09:20:24

+0

謝謝 - 這是我需要的。我將顏色作爲字符串存儲在數據庫中,但在使用此函數之前我將轉換爲顏色,因此它更易於重用。我不知道爲什麼區間和索引是字節雖然?我會玩這個。 – Sean 2013-03-28 08:12:56

+0

這是因爲R/G/B值是字節,所以對於完美的灰色(R = G = B),只有255種可能的色調。超過255個區間並沒有太多意義,並且有更多的索引比區間更有意義:) – nvoigt 2013-03-28 08:23:01

2

每個顏色分量的是數字0和255

之間的十六進制表示所有你需要做的是要做到:

int shade = 255/Intervals * index; 
return string.format("{0:X}{0:X}{0:X}", shade); 

可能會有一些rounding-上面但上面的類型問題是需要的一般概念。

+0

對不起,看到其他評論它應該是:返回字符串。格式(「{0:X2} {0:X2} {0:X2}」,陰影); – Rob 2013-03-27 09:19:25

2

那麼,你到目前爲止沒有提到過很多關於你嘗試過的東西,所以我猜你剛剛開始就被卡住了。

我可能會接近這個如下:

  1. 解剖開始和結束的顏色到他們的三個部分,從字符串的數字(你真的不能用繩子計算)
  2. 弄清楚所需答案通過將間隔(開始年底),並選擇正確的分裂(簡單的算術題,應該像開始 +(年底開始)÷ 間隔· 索引
  3. 重新組裝顏色字符串。注意允許前導零,即使用string.Format("{0:X2}{1:X2}{2:X2}", r, g, b)之類的東西。