我该怎么做?
int blue = Color.Blue.ToArgb();
int yellow = Color.Yellow.ToArgb();
blue = (blue + yellow) / 2;
Color Blue = ConvertFromRGB(blue);
答案 0 :(得分:8)
我认为您正在寻找的是:
var blueColor = Color.FromArgb((blue + yellow) / 2);
但是,我不认为它会给你实际想要的结果。
你必须非常小心地以这种方式混合颜色。就编码器而言,表示ARGB形式的颜色的int
值是相当随意的。最好将RGB组件单独混合,例如:
var color1 = Color.Blue;
var color2 = Color.Yellow;
var blueColor = Color.FromArgb((color1.R + color2.R) / 2,
(color1.G + color2.G) / 2, (color1.B + color2.B) / 2);
这会在两种颜色之间插入(取中心点),并且应该给你一些看起来更像是两种颜色混合的东西。
(请注意,我假设您在这里指的是System.Drawing.Color
类型。)
答案 1 :(得分:3)
我认为这是你可能正在寻找的东西:
int blue = Color.Blue.ToArgb();
int yellow = Color.Yellow.ToArgb();
blue = (blue + yellow)/2;
Color Blue = Color.FromArgb(blue);
答案 2 :(得分:1)
如果您正在尝试这样做,只需按颜色分组颜色:
Color average = ConvertFromRGB((Color.Blue.R + Color.Yellow.R) / 2), (Color.Blue.G + Color.Yellow.G) / 2), (Color.Blue.B + Color.Yellow.B) / 2));
答案 3 :(得分:0)
知道你对第二次分配给'蓝色'的期望是有用的 - 你肯定不会得到一片蓝色(更像是红色)。
问题是Color类将其ARGB值保持为Int32,因为4个字节中的每一个都代表Alpha,Red,Blue和Green之一。
要求在Int32表单中将两种颜色加在一起会导致意外的值,因为下一个字节'溢出'(当你添加255和1时会发生什么?)
Color.Blue,例如,-16776961。那是因为它有4个字节,如下所示:
0: 255
1: 0
2: 0
3: 255
或者:
11111111 00000000 00000000 11111111
你会发现将ARGB组件分解为单个字节要清楚得多,System.Drawing.Color允许你通过它的实例属性来做到这一点:
blue.A
blue.R
blue.G
blue.B
您可以安全地操纵这些,但请记住它们是Byte的实例,因此您无法分配0-255范围之外的值。要从组件字节创建颜色,请使用:
Color.FromArgb(a, r, g, b);
其中a, r, g, b
是字节。
有些令人困惑的是,Color.FromArgb接受int参数,而不是字节。我担心我不知道为什么,比我更好的人必须回答这个问题,但是将一个字节转换为int并生成一个值介于0到255之间的int,因此使用它是安全的。 Color还有一个私有的CheckByte类,它将每个参数传递给你,这样你就会得到一个ArgumentException而不是一个意想不到的颜色(你可能会用你的非组件方法得到它)。