2009-06-11 85 views
0

我该怎么做?转换RGB方法?

int blue = Color.Blue.ToArgb(); 
int yellow = Color.Yellow.ToArgb(); 

blue = (blue + yellow)/2; 

Color Blue = ConvertFromRGB(blue); 
+0

这是Noldorin和Jason Heine之间的心理调试摊牌。谁会赢?不要离开你的座位 – 2009-06-11 13:01:22

+0

哈哈。是的,OP的目标并不完全清楚,但我正尽我所能地设想。 – Noldorin 2009-06-11 13:07:43

+0

:)完全同意,今天早上醒来的方法是什么! – CodeLikeBeaker 2009-06-11 13:08:57

回答

8

我想你要找的东西是这样的:

var blueColor = Color.FromArgb((blue + yellow)/2); 

不过,我认为这会给你你真正想要的结果。

您必须非常小心以这种方式混合颜色。就编码器而言,表示ARGB格式的颜色的值是相当任意的。这也可能是最好的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类型在这里。)

+0

+1对于颜色混合的明确解释 – CodeLikeBeaker 2009-06-11 13:20:18

3

我觉得这是你可能会寻找:

int blue = Color.Blue.ToArgb(); 
int yellow = Color.Yellow.ToArgb(); 

blue = (blue + yellow)/2; 

Color Blue = Color.FromArgb(blue); 
1

只是平均的颜色组件的方式,如果那是你正在尝试做的:

​​
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 

您可以安全地处理这些,但要记住,他们是字节的一个实例,所以你不能分配一个值超出范围0-255的。若要从组件字节的颜色,使用方法:

Color.FromArgb(a, r, g, b); 

a, r, g, b是字节。

有点混淆,Color.FromArgb接受int参数,而不是字节。恐怕我不知道为什么,比我更好的人将不得不回答这个问题,而是将一个字节转换为一个int,并产生一个介于0和255之间的int值,因此使用这个值是安全的。Color也有一个私有的CheckByte类,它传递每个参数,所以你会得到一个ArgumentException,而不是一个意想不到的颜色(你可能会用非组件方法得到)。