2014-09-29 100 views
2

我有一個int值範圍可以從-148至10,我試圖映射此值在下面的梯度的顏色:int值轉換爲顏色的梯度

  • 黑色( -148)
  • 青色
  • 綠色
  • 橙色
  • 白色(10)

在視覺上,我的顏色漸變看起來是這樣的:

我首先想到的是向下突破的範圍內(-148〜10)到對應於這八個小團體顏色,但顯然會導致多個值轉換爲相同的顏色。我想在這個漸變中使用更多或甚至所有的顏色,但我不知道如何去做這件事。任何人都可以提供建議嗎?對於它的價值,我正在使用C#/ .NET,所以我需要將我的int轉換爲RGB值。

+0

如果你的範圍是[0,255],你知道答案嗎? – 2014-09-29 18:51:15

+0

我不會,看着黑色和白色的開始和結束點。 – TaW 2014-09-29 19:01:00

+1

您的圖片的寬度爲200,大小爲203字節。我會讀出159個值並將它們存儲在列表中。當然,你可以在c#中計算它們,但是這會花費更多的資源,imo .. – TaW 2014-09-29 19:05:47

回答

2

您是否意味着像這樣的映射功能? (在顏色表透明條目是在顏色1從列表中的第9項所採取的值10的情況下的虛設)

Color[] colors = new Color[] { Colors.Black, Colors.Blue, Colors.Cyan, Colors.Green, Colors.Yellow, Colors.Orange, Colors.Red, Colors.White, Colors.Transparent }; 
    public Color IntToColor(int i) 
    { 
     float scaled = (float)(i + 148)/158 * 7; 
     Color color0 = colors[(int)scaled]; 
     Color color1 = colors[(int)scaled + 1]; 
     float fraction = scaled - (int)scaled; 
     Color result = new Color(); 
     result.R = (byte)((1 - fraction) * (float)color0.R + fraction * (float)color1.R); 
     result.G = (byte)((1 - fraction) * (float)color0.G + fraction * (float)color1.G); 
     result.B = (byte)((1 - fraction) * (float)color0.B + fraction * (float)color1.B); 
     result.A = 255; 
     return result; 
    } 

PS:爲簡單起見不存在用於檢查[-148:10]範圍 PPS:我知道我的代碼不會贏得任何選美比賽。

+0

這對於那些相鄰的顏色可以很好地工作。你可能想看看[this](http://stackoverflow.com/questions/26165071/how-to-append-two-brush-classes/26167795?noredirect=1#comment41044719_26167795)帖子來看比較混合rgb組件和混合顏色的顏色進一步分開.. – TaW 2014-10-03 12:10:23

2

你實際上正在尋找HSV色彩空間。你可以做的是:

1地圖的[-148,10]到[0,360]度H中

2固定S和V值。 (我想S = 1和V = 1你的情況)

3獲得從先前計算出的H,S HSV顏色,和V

4轉換HSV顏色以RGB顏色和使用。

1

您的圖片的寬度爲200,大小爲203字節。我會讀出159個值並將它們存儲在List中。當然,你可以在C#中計算它們,但這將需要更多的資源,IMO ..

Dictionary<int, Color> mycolors = new Dictionary<int,Color>(); 
    Bitmap bmp = new Bitmap("D:\\spectrum.png"); 

    float fx = bmp.Width/159f; 
    for (int x = 0; x < 160; x++) 
     mycolors.Add(x - 148, bmp.GetPixel((int)(fx * x), 1)); 

這將映射159種顏色。如果你想要比這些更多(或者你的圖像保持200以上),則需要進行計算。但是你不能將它們映射到你的整數範圍 - 所以請下定決心! Here是實現HSV-> RGB映射的代碼,您可以使用該映射,至少從藍色變爲紅色。黑色和白色的淡入淡出必須來自兩個以上的例程......最適合Fratyx的內插代碼。 (因爲它會從每個區段的最清晰的顏色的外環切割一點..)