转换RGB方法?

时间:2009-06-11 12:54:40

标签: c# .net asp.net algorithm

我该怎么做?

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

blue = (blue + yellow) / 2;

Color Blue = ConvertFromRGB(blue);

4 个答案:

答案 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而不是一个意想不到的颜色(你可能会用你的非组件方法得到它)。