System.Drawing.Color 값 설정


80

안녕하세요 R G B값 을 설정하는 방법 System.Drawing.Color.G?

어떤처럼 System.Drawing.Color.G=255;그것의 읽기 전용 있기 때문에 허용되지 않습니다

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

Color사용자 지정 R G B값 을 할당 하여 개체 를 생성하기 만하면 됩니다.


1
이 질문에 대한 다른 사람들에게이 문제는 System.Drawing에만 영향을 미칩니다. WPF를 사용하는 경우 System.Windows.Media를 사용해야합니다. 자세한 내용은이 게시물을 참조하십시오. stackoverflow.com/questions/2428930/…
HK1

답변:



12

Color구조는 불변 특정 인스턴스가 생성되면 그 속성의 값이 변경 될 수없는 것을 의미한다 (모든 구조 정말로되어야 참조).

대신 원하는 속성 값으로 구조 의 인스턴스 를 만들어야합니다 . 구성 요소 RGB 값을 사용하여 색상을 만들려면 다음 FromArgb메서드 를 사용해야합니다 .

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

2
-1 : "모든 구조가 실제로 있어야하기 때문에". C 코드 작성에 행운을 빕니다.
Dariusz 2013 년

12
@Dariusz이 질문에 [c] 태그가 없습니다. 저는 항상 C 코드를 작성합니다. 저는 C # 코드를 작성하는 것과 같은 방식으로 작성하지 않습니다.
Cody Gray

9

Color.FromArgb 메서드를 사용하여 새 색상 구조를 만들어야합니다.

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

4

하나의 색상 구성 요소 만 변경하도록 확장 할 수 있습니다.

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암시 적으로 변환 가능한 클래스 var temp = myColor.AsArgb(); temp.Green=100; myColor = temp;가 있었다면 예를 들어 myColor명명 된 색상이거나 시스템 색상이었던 경우 ...
supercat

1
... 이러한 특성은 AsArgb방법에 의해 필터링 되지만 Green해당 방법에 의해 필터링되지 않은 특성 은 그대로 유지됩니다. 실제로 오픈 필드 구조 유형으로 변환하는 확장 방법을 정의한 경우 해당 접근 방식은 Color정의 된대로 도 실행 가능할 수 있으며 작업을 수행하는 가장 좋은 방법 일 수 있습니다.
supercat 2013

2

다음과 같이 할 수 있습니다.

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());
        }
    }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.