[英]Converting int value to a color in a gradient
我有一个int值,范围从-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.