设置 System.Drawing.Color 值

85

您好,如何在System.Drawing.Color.G中设置R G B值?

类似System.Drawing.Color.G=255;这样设置是不允许的,因为它是只读的。

Property or indexer 'System.Drawing.Color.G' cannot be assigned toit is read only

我只需要通过指定自定义的R G B值来创建一个Color对象


1
注意对于来到这个问题的其他人,这个问题只影响System.Drawing。如果你使用WPF,你应该使用System.Windows.Media。有关更多信息,请参见此帖子:https://dev59.com/o3E95IYBdhLWcg3wKqsk - HK1
6个回答

156
你可以使用静态的FromArgb方法来创建一种颜色:
Color redColor = Color.FromArgb(255, 0, 0);

您还可以使用以下重载指定alpha值。


简洁明了。 - Chandraprakash

13

Color 结构是 不可变的(实际上所有结构体都应该是这样),这意味着一旦创建了该特定实例,其属性值就无法更改。

相反,您需要使用希望拥有的属性值创建一个新的结构体实例。由于您希望使用其组件 RGB 值创建颜色,因此需要使用 FromArgb 方法

Color myColor = Color.FromArgb(100, 150, 75);

2
-1 表示“因为所有结构都应该如此”。祝你编写一些 C 代码。 - Dariusz
12
@Dariusz,我在这个问题上没有看到 [c] 标签。我经常编写 C 代码,只是与我编写 C# 代码的方式不同... - Cody Gray

10

你必须使用Color.FromArgb方法来创建新的颜色结构

var newColor = Color.FromArgb(0xCC,0xBB,0xAA);

5
您可以创建扩展程序来仅更改一个颜色组件。
static class ColorExtension
{
    public static Color ChangeG(Color this color,byte g) 
    {
        return Color.FromArgb(color.A,color.R,g,color.B);
    }
}

那么你可以使用这个:
  yourColor = yourColor.ChangeG(100);

4
好的,但请不要这样做。这会隐藏你实际上正在创建一个新结构体实例的事实,对于那些还不理解不可变性的人来说非常混乱。对于那些已经理解的人来说也相当无用。 - Cody Gray
1
首先,你需要理解不可变性。如果你一直写yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);,代码会变得更加丑陋。因此,这是有用的。 - Stecya
1
很难理解你认为显式代码有什么丑陋之处。 - Cody Gray
1
@CodyGray:写出所有内容的一个主要问题是,很难明显看出代码的意图和/或效果是否仅仅是要改变 G,还是还有其他影响。鉴于 Color 结构体的设计,我认为没有什么好的解决方法;如果有一个简单的 ArgbColor 结构体,其中有四个公开的单字节字段,以及一个可隐式转换到 Color 类的 Color 类,则var temp = myColor.AsArgb(); temp.Green=100; myColor = temp;将清楚地表明,例如,如果 myColor 是一个命名的或系统颜色... - supercat
1
任何这样的特征都将被 AsArgb 方法过滤掉,但除了那个方法没有被过滤掉的 Green 特性将被保留。实际上,如果定义一个扩展方法来转换为开放字段结构类型,即使使用已定义的 Color,这种方法也可能可行,并且可能是最好的方法。 - supercat

3

您可以这样做:

Color c = Color.FromArgb(red, green, blue); //red, green and blue are integer variables containing red, green and blue components

1
using System;
using System.Drawing;
public struct MyColor
    {
        private byte a, r, g, b;        
        public byte A
        {
            get
            {
                return this.a;
            }
        }
        public byte R
        {
            get
            {
                return this.r;
            }
        }
        public byte G
        {
            get
            {
                return this.g;
            }
        }
        public byte B
        {
            get
            {
                return this.b;
            }
        }       
        public MyColor SetAlpha(byte value)
        {
            this.a = value;
            return this;
        }
        public MyColor SetRed(byte value)
        {
            this.r = value;
            return this;
        }
        public MyColor SetGreen(byte value)
        {
            this.g = value;
            return this;
        }
        public MyColor SetBlue(byte value)
        {
            this.b = value;
            return this;
        }
        public int ToArgb()
        {
            return (int)(A << 24) || (int)(R << 16) || (int)(G << 8) || (int)(B);
        }
        public override string ToString ()
        {
            return string.Format ("[MyColor: A={0}, R={1}, G={2}, B={3}]", A, R, G, B);
        }

        public static MyColor FromArgb(byte alpha, byte red, byte green, byte blue)
        {
            return new MyColor().SetAlpha(alpha).SetRed(red).SetGreen(green).SetBlue(blue);
        }
        public static MyColor FromArgb(byte red, byte green, byte blue)
        {
            return MyColor.FromArgb(255, red, green, blue);
        }
        public static MyColor FromArgb(byte alpha, MyColor baseColor)
        {
            return MyColor.FromArgb(alpha, baseColor.R, baseColor.G, baseColor.B);
        }
        public static MyColor FromArgb(int argb)
        {
            return MyColor.FromArgb(argb & 255, (argb >> 8) & 255, (argb >> 16) & 255, (argb >> 24) & 255);
        }   
        public static implicit operator Color(MyColor myColor)
        {           
            return Color.FromArgb(myColor.ToArgb());
        }
        public static implicit operator MyColor(Color color)
        {
            return MyColor.FromArgb(color.ToArgb());
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接