显然,.net中没有预定义列表。
我想使用多种标准颜色,例如类似于红色,绿色,蓝色,黄色......,即由00和FF组成的典型颜色,其次是具有额外7F组件的颜色,...
有没有办法检索这些“标准”颜色,还是我必须自己编写IEnumerable<Color>
?
编辑:这是RGB值的可能输出。
请注意集合的顺序,因为在添加80之前必须完成00 / FF枚举,并且在添加40 / B0之前必须完成00/80 / FF枚举, 等等。 中的顺序无关紧要(即00 FF 00可能在00 00 FF之前)。
00 00 00 // start out with 00 and FF components
00 00 FF
00 FF 00
FF 00 00
FF FF 00
FF 00 FF
00 FF FF
FF FF FF
00 00 80 // ok, now add 80
00 80 00
...
80 80 80
FF 00 80
FF 80 00
FF 80 80
80 FF 00
80 FF 80
FF FF 80
...
// now add 40 and B0
答案 0 :(得分:8)
Colors
类上有许多预定义的ARGB颜色,Color
结构也是如此。这些包含Yellow
,White
,Green
等内容......
如果您需要用户定义的系统颜色,可以使用SystemColors
类,其中包含ActiveBorder
,WindowText
等内容...
更新
框架中没有任何内容可以根据ARGB值对颜色进行排序,因为它没有多大意义
您可以使用Linq按其组件(OrderBy
扩展方法)对颜色列表进行排序。
答案 1 :(得分:1)
可能SystemColors课对你来说是正确的。
答案 2 :(得分:1)
AFAIK“标准”颜色不等于基于您描述的图案的RGB值的颜色。例如紫色有#B803FF RGB值(类似'紫红色'有#FF00FF)。
答案 3 :(得分:1)
这是生成序列的一种相当快速的方法:
public static IEnumerable<Color> StandardColors ()
{
int r = 0;
int g = 0;
int b = 0;
int inc = 0x100;
yield return Color.FromArgb (0, 0, 0);
while (true) {
if (((r | g | b) & inc) != 0) {
int outR = r == 0 ? 0 : r - 1;
int outG = g == 0 ? 0 : g - 1;
int outB = b == 0 ? 0 : b - 1;
yield return Color.FromArgb (outR, outG, outB);
}
r += inc;
if (r > 256) {
r = 0;
g += inc;
if (g > 256) {
g = 0;
b += inc;
if (b > 256) {
b = 0;
inc >>= 1;
if (inc <= 1) {
break;
}
}
}
}
}
}
这当然可以改善。例如,应该避免使用单独的outR / G / B变量,并且应该从奇数(基于inc
)值开始递增2 * inc,以避免必须测试该值是否已经早先生成
使用此测试
static void Main (string[] args)
{
var colors = StandardColorEnumerator.StandardColors ().Take (15)
.Concat (StandardColorEnumerator.StandardColors ().Skip (1000).Take (10));
foreach (var color in colors) {
Console.WriteLine (color.B + "\t" + color.G + "\t" + color.R);
}
Console.ReadKey (true);
}
生成以下输出:
0 0 0
0 0 255
0 255 0
0 255 255
255 0 0
255 0 255
255 255 0
255 255 255
0 0 127
0 127 0
0 127 127
0 127 255
0 255 127
127 0 0
127 0 127
15 47 191
15 47 207
15 47 223
15 47 239
15 47 255
15 63 0
15 63 15
15 63 31
15 63 47
15 63 63