2010-08-15 22 views
10

मैं सी # के लिए काफी नया हूं और मूल छवि प्रसंस्करण सॉफ्टवेयर करने की कोशिश कर रहा हूं। मैं समझता हूँ कि इस स्निपेट एक WriteableBitmap पिक्सेल "वर्तमान" के ARGB पूर्णांक मूल्य से निकालता है ए, आर, जी, बी>> ऑपरेटर सी # में क्या करता है?

for(int i = 0; i < bitmapArray.Length; i++) { 
    var current = bitmapArray[i]; 

    var alpha = (byte)(current >> 24); 
    var red = (byte)(current >> 16); 
    var green = (byte)(current >> 8); 
    var blue = (byte)(current); 
    //Some code 
} 

क्या ">>" मूल्यों कन्वर्ट करने के लिए कर रहा है?

इसके अलावा, अगर मैं व्यक्तिगत रूप से आर, जी और बी के लिए कुछ गणना करता हूं, तो मैं मूल पिक्सेल को नए के साथ बदलने के लिए उन्हें एक पूर्णांक ARGB मान में कैसे परिवर्तित कर सकता हूं?

अग्रिम धन्यवाद।

संपादित करें: धन्यवाद दोस्तों, अब यह समझ में आता है।

+0

यह वास्तव में काफी परेशान है कि सिल्वरलाइट में 'रंग' संरचना' Int32' को 'रंग' में परिवर्तित करने का माध्यम प्रदान नहीं करती है। – AnthonyWJones

उत्तर

12

यह दाईं ओर current मान की बिट्स को स्थानांतरित कर रहा है। इस विशेष कोड स्निपिट के मामले में, यह चयनित बिटमैप सरणी तत्व से अलग-अलग रंग बाइट्स में रंगीन जानकारी के प्रत्येक बाइट निकालने लगते हैं।

http://msdn.microsoft.com/en-us/library/xt18et0d.aspx

यह मानते हुए कि आपके सरणी ints होता है, एक गणना मूल्य सरणी तत्व में वापस लाने के लिए, आप थोड़ा बदलने प्रक्रिया को उल्टा होता है और या परिणामों को वापस एक साथ है, तो जैसे:

int current = (alpha << 24) | (red << 16) | (green << 8) | blue; 
+0

मुझे आश्चर्य है ... 'BitConverter.GetBytes (वर्तमान) 'बहुत जटिल है? एचएम, शायद गंभीर छवि हेरफेर के लिए बहुत धीमी है। – Joey

+0

@ जोहान्स: 'बिटकॉन्टर' बहुत तेज़ है। मुझे लगता है कि यह यहां उचित होगा। –

+1

यह इतना आसान, स्पष्ट और सामान्य ऑपरेशन है कि मुझे बाइनरी ऑपरेटरों के अलावा कुछ भी उपयोग करने का लाभ नहीं दिख रहा है।यदि आपको समझ में नहीं आता कि क्या हो रहा है, तो आपको छवि प्रसंस्करण से सीखना या दूर रहना चाहिए (विशेष रूप से 'आप' सामान्य रूप से नहीं, सामान्य रूप से) –

16

यह बाइनरी शिफ्ट ऑपरेटर है।

AAAAAAAA RRRRRRRR GGGGGGGG BBBBBBBB 

तो, कि पूरी पारी:

आप एक रंग से परिभाषित किया गया है, तो (क, आर, जी, बी), यह द्विआधारी प्रतिनिधित्व होगा इस तरह दिखेगा (8 बिट का एक चैनल गहराई कल्पना करते हुए) है 24 से अधिक स्थानों पर बात और आप 16 से

AAAAAAAA 

शिफ्ट अल्फ़ा चैनल के साथ छोड़ दिया जाता है और आप अल्फ़ा चैनल और लाल चैनल प्राप्त

AAAAAAAARRRRRRRR 

अब, के बाद से है कि एक बाइट के रूप में कास्ट किया गया है, केवल पहले 8 बिट निकाले जाते हैं

(byte)AAAAAAAARRRRRRRR == RRRRRRRR 

तुम भी 16 स्थानों और 11111111 (0xFF) के साथ AND'ing

AAAAAAAARRRRRRRR & 
0000000011111111 
---------------- 
00000000RRRRRRRR 
स्थानांतरण द्वारा लाल चैनल मिल सकता है
+1

+1। यह एक महान स्पष्टीकरण है, मैंने हमेशा थोड़ा स्थानांतरण और यह कैसे काम करता है के बारे में सोचा है। यदि आपके पास समय था, तो यह देखना अच्छा होगा कि उपर्युक्त रंग मूल्य और कैसे बदलता है इसका एक उदाहरण देखें। कुछ अन्य आरजीबी मूल्य में बिट स्थानांतरण स्थानांतरण 128, 64, 256 को कैसे बदलता है। साथ ही, मैं अभी भी '(बाइट) एएएएएएएएएएएएआरआरआरआरआरआरआरआर == आरआरआरआरआरआरआरआर' (यानी इसे दाएं से बाएं से निकाला गया है) नहीं किया है, लेकिन कम से कम मुझे इस जवाब पर जाने से पहले मैंने और अधिक किया है। –

+0

@ ओटाकू: बाइनरी बाईं ओर पढ़ने के लिए पढ़ा जाता है, और इस मामले में, "पहले 8 बिट्स" का मतलब है। – junkforce

+0

यदि आप बाइट में पिक्सल और 0xff000000 डालते हैं, तो आपको शून्य मिलेगा, इससे कोई फर्क नहीं पड़ता कि सही 8 बिट्स 0 के बाद से क्या होगा। इसलिए मुझे नहीं लगता कि आपका अंतिम ब्लॉक सही है। – Jacob

2

रॉबर्ट के जवाब देने के लिए इसके अलावा - और अपने प्रश्न के दूसरे भाग को कवर करने के लिए - आप << (left-shift) और | (bitwise OR) ऑपरेटर्स का उपयोग कर एक पूर्णांक के लिए वापस अलग घटकों को जोड़ सकते हैं:

int combined = (alpha << 24) | (red << 16) | (green << 8) | blue; 
+0

@Robert: ओपी निर्दिष्ट नहीं करता है, और मुझे लगता है कि दार्शनिक रूप से यह न तो है - यह सिर्फ 4 हस्ताक्षरित ऑक्टेट्स का एक सेट है। यदि * स्टोरेज तंत्र * एक 'int' है तो मेरा कोड ठीक काम करेगा (और अल्फा मान 127 से अधिक होने पर परिणाम नकारात्मक' int 'होगा)। यदि भंडारण तंत्र एक 'uint' है तो कुछ अतिरिक्त कास्टिंग आदि की आवश्यकता होगी। – LukeH

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