2010-04-22 13 views
9

सिस्टम। ड्रॉइंग। रंग में रंग के इंट प्रतिनिधित्व को वापस करने के लिए एक ToArgb() विधि है।
सिल्वरलाइट में, मुझे लगता है कि हमें System.Windows.Media.Color का उपयोग करना होगा। इसमें ए, आर, जी, बी सदस्य हैं, लेकिन एक मूल्य वापस करने के लिए कोई विधि नहीं है।
मैं ToArgb() को कैसे कार्यान्वित कर सकता हूं? System.Drawing.Color, ToArgb() मेंकार्यान्वयन ToArgb()

return (int) this.Value; 

System.Windows.Media.Color एक FromArgb (बाइट ए, बाइट आर, बाइट जी, बाइट बी) विधि है के होते हैं। FromArgb() से उपयोग करने के लिए ToArgb() द्वारा लौटाए गए इंट को मैं कैसे विघटित करूं?

किसी भी संकेत दिए गए के लिए धन्यवाद ...

उत्तर

30

लघु और तेज़। एक अतिरिक्त विधि कॉल के बिना, लेकिन तेजी से संचालन के साथ।

// To integer 
int iCol = (color.A << 24) | (color.R << 16) | (color.G << 8) | color.B; 

// From integer 
Color color = Color.FromArgb((byte)(iCol >> 24), 
          (byte)(iCol >> 16), 
          (byte)(iCol >> 8), 
          (byte)(iCol)); 
+0

वीबी.नेट में ओवरफ्लोएक्सप्शन में परिणाम। 'सीबीटी ((आईकॉल >> 24) और एचएफएफ) 'काम करता है। – mbomb007

5

ध्वनि आप दो सवाल यहाँ पूछ रहे हैं की तरह है, मुझे उस पर फिर से वार लेते हैं। भले ही, आप BitConverter कक्षा का उपयोग करना चाहेंगे।

this page से:

32-बिट ARGB मूल्य की बाइट आदेश AARRGGBB है।

तो, ToArgb() लागू करने के लिए, आप एक extension method कि कुछ इस तरह करता है लिख सकते हैं:

public static int ToArgb(this System.Windows.Media.Color color) 
{ 
    byte[] bytes = new byte[] { color.A, color.R, color.G, color.B }; 
    return BitConverter.ToInt32(bytes, 0); 
} 

और "विघटित इंट ToArgb() द्वारा दिया FromArgb() के साथ उपयोग करने के लिए" करने के लिए, आप यह कर सकता है:

byte[] bytes = BitConverter.GetBytes(myColor.ToArgb()); 
byte aVal = bytes[0]; 
byte rVal = bytes[1]; 
byte gVal = bytes[2]; 
byte bVal = bytes[3]; 

Color myNewColor = Color.FromArgb(aVal, rVal, gVal, bVal); 

उम्मीद है कि इससे मदद मिलती है।

+0

बहुत उपयोगी, धन्यवाद। – Number8

+0

मुझे लगता है कि आपको पीछे की ओर सरणी मिली है। '32-बिट एआरजीबी मान का बाइट ऑर्डरिंग AARRGGBB है।' 8-हेक्स-डिजिट यूंट के अंकों को संदर्भित करता है। थोड़ा एंडियन (शायद अधिक आम मामला) में आपका कोड गलत है, नीला पहले आता है। – Zarat

+0

@Zarat, आप इंटेल संगत चिप्स के लिए सही हैं। बिटकॉन्टर आपके बाइट ऑर्डर के एंडियन-नेस को नहीं बदलता है, इसलिए उसी कोड में बाइट्स को एंडियन-ऑर्डर के आधार पर अलग-अलग आदेश दिया जा सकता है। –

1

बस एक छोटी ध्यान दें:

एक "रंग" वस्तु का पूर्णांक प्रतिनिधित्व प्राप्त कर रहा है जब color.ToArgb() कॉल के बजाय सीधे में bitshift-संचालन का उपयोग कर मेरे लिए 4 गुना तेजी से हो रहा है चिह्नित उत्तर तो यदि आपके पास .ToArgb() तक पहुंच है, तो हमेशा इसका उपयोग करें!

थ्रेड निर्माता ने कहा कि उसे इसका उपयोग नहीं है, इसलिए निश्चित रूप से चिह्नित उत्तर अभी भी सही है, इसमें दावा किए गए "तेज़ संचालन" द्वारा भ्रमित नहीं किया जा रहा है।

बस ध्यान रखें: रंगीन उदाहरण का रंग आंतरिक रूप से पहले से ही int मान के रूप में सहेजा गया है, इसलिए ToArgb() इसे वापस लौट रहा है, जबकि प्रत्येक एकल बाइट को एक्सेस करने के दौरान (गुणों द्वारा।, आर।, जी।, बी।) और फिर बिट्सफिफ्टिंग द्वारा उन्हें फिर से इकट्ठा करना एक सर्कल में थोड़ी सी चल रहा है।

+1

System.Windows.Media.Color न तो एक ToArgb विधि है और न ही यह आंतरिक रूप से एक int के रूप में रंग स्टोर करता है। ऐसा लगता है कि आपने सवाल नहीं पढ़ा था। – Zarat

संबंधित मुद्दे