gpt4 book ai didi

c# - 色表算法

转载 作者:行者123 更新时间:2023-11-30 19:57:08 24 4
gpt4 key购买 nike

一周多以来,我一直在寻找如何创建这样的东西。

enter image description here

我有代码和 for 循环来通过 X、Y 坐标和所有内容创建每个面板。每个面板都是数组的一部分,从左上角的 0 开始,到右上角的 90 结束,但我不关心它是如何完成的,只要它完成了,它的面板和工作就可以了。颜色不需要相同但相似,这样我就可以拥有全屏颜色选择器。如果有人知道使用 Color.FromARGB 或仅使用 Color 类来采用一种特定颜色并使其变亮十倍以设置面板 backColor 的代码,请帮助我。谢谢。

(这是我为 windows 平板电脑制作的应用程序,是触摸屏。该应用程序的目的是全屏,而不是评论它是 windows 平板电脑,因为我必须自己制作颜色选择器,不能使用内置颜色对话框。)

最佳答案

为了获得最佳控制,我建议使用颜色计算函数。

enter image description here

那里有很多;这是我使用的一个:

Color HsvToRgb(double h, double S, double V)
{
/// Convert HSV to RGB
/// h is from 0d - 360d
/// s,v values are 0d - 1d
/// r,g,b values are 0 - 255

int hi = Convert.ToInt32(Math.Floor(hue / 60)) % 6;
double f = hue / 60 - Math.Floor(hue / 60);

value = value * 255;
int v = Convert.ToInt32(value);
int p = Convert.ToInt32(value * (1 - saturation));
int q = Convert.ToInt32(value * (1 - f * saturation));
int t = Convert.ToInt32(value * (1 - (1 - f) * saturation));

if (hi == 0) return Color.FromArgb(255, v, t, p);
else if (hi == 1) return Color.FromArgb(255, q, v, p);
else if (hi == 2) return Color.FromArgb(255, p, v, t);
else if (hi == 3) return Color.FromArgb(255, p, q, v);
else if (hi == 4) return Color.FromArgb(255, t, p, v);
else return Color.FromArgb(255, v, p, q);
}

请注意输入范围!!

现在很容易在类级别设置Color数组:

int width = 10;
int height = 9;
Color[,] colors;

并填写:

void loadColors()
{
colors = new Color[width, height];

// load greys
for (int i = 0; i < width; i++ ) colors[i, 0] = HsvToRgb(0f, 0f, 1f * i / width);
// load bright stripe:
for (int i = 0; i < width; i++) colors[i, 1] = HsvToRgb(i* 360f / width, 0.33f, 1f);
// load matrix:
for (int j = 2; j < height; j++)
for (int i = 0; i < width; i++)
colors[i, j] = HsvToRgb(i * 360f / width, 1f, 1f * (height - j + 2) / height);
}

从这里可以快速设置 PanelsBackColors

这是一个 Form.Paint 函数,我用来创建上面的屏幕截图:

private void Form1_Paint(object sender, PaintEventArgs e)
{
int w = ClientSize.Width / width;
int h = ClientSize.Height / height;

for (int j = 0; j < height; j++)
for (int i = 0; i < width; i++)
{
using (SolidBrush brush = new SolidBrush(colors[i,j]))
e.Graphics.FillRectangle(brush, i * w, j * h, w, h);
}
}

当然很简单,就是把两个数改成更细的网格,这里是20x20:

enter image description here

另请注意,色调的均匀间距并不能很好地发挥作用,human eye 也不是这样。我们常见的显示系统对整个光谱的色调变化也同样敏感。

眼睛其实相当sensitive变成绿色

the just-noticeable difference in wavelength varies from about 1 nm in the blue-green and yellow wavelengths, to 10 nm and more in the longer red and shorter blue wavelengths

但是我们的显示器在创建不同的绿色色调方面做得非常糟糕..

使用 perceptionally evenly spaced hues 的改编列表可能会有所帮助,具体取决于您想要什么..

enter image description here

使用这个单行:

private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
int hue = (int) ((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y).GetHue();
}

上图给了我们一个这样的色调列表:

20 32 41 50 58 72 133 163 170 177 183 190 197 206 269 288 307 324 334 346 

我对它做了一些修改,也许是为了让它更好地与我的显示器配合使用:

List<int> hues = new List<int> 
{ 20, 32, 41, 50, 58, 72, 133, 162, 180, 188, 195, 205, 215, 223, 246, 267, 288, 300, 320, 346 };

并将上面的代码(保持宽度= 20)更改为

HsvToRgb(hues[i],..

结果:

enter image description here

更新:我用一个大大简化的函数替换了 HsvToRgb 函数。

关于c# - 色表算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31612232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com