簡體   English   中英

將int值轉換為漸變顏色

[英]Converting int value to a color in a gradient

我有一個int值,范圍從-148到10,並且我試圖將此值映射到以下漸變中的顏色:

  • 黑色(-148)
  • 藍色
  • 青色
  • 綠色
  • 黃色
  • 橙子
  • 紅色
  • 白(10)

在視覺上,我的顏色漸變如下所示:

我的第一個想法是將范圍(-148到10)分解為與這八種顏色相對應的較小組,但是顯然導致多個值轉換為同一顏色。 我想在此漸變中使用更多或什至所有顏色,但是我不確定該怎么做。 誰能提供一些建議? 對於它的價值,我正在C#/。NET中工作,因此需要將int轉換為RGB值。

您實際上正在查看HSV顏色空間。 您可以做的是:

1將[-148,10]映射為H的[0,360]度

2固定S和V值。 (我猜在您的情況下,S = 1,V = 1)

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

4將HSV顏色轉換為RGB顏色並使用。

您是說這樣的映射功能嗎? (在顏色列表中的“透明”條目在值為10的情況下是虛擬的,其中,顏色1從列表的第9個條目中選取)

  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:我知道我的代碼不會贏得任何選美比賽。

您的圖片的寬度為200,大小為203個字節。 我會讀出159個值並將它們存儲在列表中。 當然,您可以在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個以上),則需要進行計算。 但是您不能將它們映射到整數范圍內-因此請下定決心! 是實現HSV-> RGB映射的代碼,您可以使用它,至少從藍色變為紅色。 淡入黑色和淡入白色必須來自另外兩個例程。最好以Fratyx的內插代碼方式進行。 (盡管這樣,它將與每個段的最清晰顏色的外環切開一點。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM