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 के लिए "जैसा कि सभी संरचनाएं वास्तव में होनी चाहिए"। कुछ सी कोड लिखने का सौभाग्य।
डेरियस

12
@ डैरिज़ मुझे इस सवाल पर एक [सी] टैग नहीं दिखता है। मैं सी कोड हर समय लिखते हैं, मैं सिर्फ यह उसी तरह के रूप में मैं अपने सी # कोड कर ... कुछ भी न लिखें
कोड़ी ग्रे


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
हाँ, लेकिन ऐसा मत करो। यह इस तथ्य को छिपाता है कि आप वास्तव में संरचना का एक नया उदाहरण बना रहे हैं, किसी ऐसे व्यक्ति के लिए बहुत भ्रमित करना जो पहले से ही अपरिवर्तनीयता को नहीं समझता है। और जो करता है उसके लिए काफी बेकार है।
कोड़ी ग्रे

1
सबसे पहले आपको अपरिवर्तनीयता को समझने की आवश्यकता है। यदि आप yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);हर समय लिखेंगे तो कोड बदसूरत हो जाएगा । तो यह उपयोगी है
स्टेक्या

1
जो आपको लगता है कि कोड के बारे में बदसूरत है यह समझना मुश्किल है।
कोड़ी ग्रे

1
@ कोडीग्रे: सबकुछ लिखने के साथ एक बड़ी समस्या यह है कि यह शायद ही स्पष्ट रूप से स्पष्ट है कि क्या कोड का इरादा और / या प्रभाव केवल परिवर्तन Gकरना होगा, या क्या इसके अन्य प्रभाव भी होंगे। रंग संरचना के डिजाइन को देखते हुए, मुझे नहीं लगता कि इसे ठीक करने का कोई अच्छा तरीका है; अगर वहाँ ArgbColorचार उजागर एकल-बाइट क्षेत्रों के साथ एक सरल संरचना थी , और एक Colorवर्ग जिस पर यह स्पष्ट रूप से परिवर्तनीय था, तो var temp = myColor.AsArgb(); temp.Green=100; myColor = temp;यह स्पष्ट कर देगा कि अगर उदाहरण के लिए myColorएक नामित या सिस्टम रंग था ...
18

1
... कि इस तरह के किसी भी धर्मार्थ को AsArgbविधि द्वारा फ़िल्टर किया जाएगा , लेकिन इसके अलावा किसी भी लक्षण Greenको उस विधि द्वारा फ़िल्टर नहीं किया गया था। वास्तव में, यदि कोई व्यक्ति खुले-क्षेत्र संरचना प्रकार में बदलने के लिए एक विस्तार विधि को परिभाषित करता है, तो वह दृष्टिकोण Colorपरिभाषित के साथ भी व्यावहारिक हो सकता है, और चीजों को करने का सबसे अच्छा तरीका हो सकता है।
सुपरकाट

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());
        }
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.