2009-07-15 4 views
10

सिल्वरलाइट 3 में अब एक लिखने योग्य बिटमैप है जो पिक्सेल क्षमताओं को प्राप्त/प्रदान करता है। यह बहुत की तरह किया जा सकता है:सिल्वरलाइट के लिखने योग्य बिटमैप

// setting a pixel example 
WriteableBitmap bitmap = new WriteableBitmap(400, 200); 
Color c = Colors.Purple; 
bitmap.Pixels[0] = c.A << 24 | c.R << 16 | c.G << 8 | c.B; 

मूल रूप से, एक पिक्सेल की स्थापना अपने रंग सेट करना शामिल है, और कहा कि एक पूर्णांक में अल्फा, लाल, नीले, हरे मूल्यों bitshifting से आता है।

मेरा सवाल यह है कि, आप एक पूर्णांक को रंग में कैसे बदल देंगे? क्या इस उदाहरण में लापता स्थान में चला जाता है:

// getting a pixel example 
int colorAsInt = bitmap.Pixels[0]; 
Color c; 
// TODO:: fill in the color c from the integer ?? 

किसी भी मदद आप हो सकता है के लिए धन्यवाद, मैं अपने बिट स्थानांतरण पर अभी नहीं कर रहा हूँ और मुझे यकीन है कि दूसरों को कुछ बिंदु पर इस अवरोध में चलाने जाएगा।

उत्तर

0
Color.FromArgb(intVal) 
+3

स्पष्टीकरण के लिए, Silverlight में कोई FromArgb (int) विधि नहीं है .. केवल FromArgb (बाइट, बाइट, बाइट, बाइट) - यह मेरी समस्या का हिस्सा है – SmartyP

0

आप ColorTranslator class की तलाश में हो सकता है, लेकिन मुझे यकीन है कि यह SilverLight में उपलब्ध है नहीं कर रहा हूँ या आप क्या जरूरत है। यद्यपि इसके बारे में जागरूक होना बिल्कुल अच्छा है।

संपादित करें: Here was one person's suggestion (कक्षा को डुप्लिकेट करने के लिए प्रतिबिंब का उपयोग करें, इसलिए तब से आपके पास एक कनवर्टर उपलब्ध है जो लोग पहले ही परिचित हैं)।

+0

परावर्तक का उपयोग करने पर अच्छा सुझाव .. यह मुझे कहां मिला मैं आर, जी, बी मानों को पढ़ सकता था, और थोड़ा और हैकिंग के बाद मुझे अल्फा पार्सिंग भी मिली .. मैंने थोड़ा सा स्थानांतरण का उपयोग करके इसके साथ एक जवाब जोड़ा .. – SmartyP

4

आप संभवतः इस्तेमाल कर सकते हैं BitConverter.GetBytes() एक बाइट सरणी कि FromArgb के भार के कि Silverlight के साथ काम करेगा करने के लिए अपने पूर्णांक कन्वर्ट करने के लिए ...

Color.FromArgb(BitConverter.GetBytes(intVal)); 

// or if that doesn't work 
var bytes = BitConverter.GetBytes(intVal); 
Color.FromArgb(bytes[3], bytes[2], bytes[1], bytes[0]); 
+0

दूसरा सुझाव यहां महान काम करता है, लेकिन बिट्स हैं पीछे, यह काम करता है: रंग।FromArgb (बाइट्स [3], बाइट्स [2], बाइट्स [1], बाइट्स [0]); – SmartyP

+0

यह बिटमैप के पिक्सेल पर ऑपरेटिंग के लिए भयानक (अस्वीकार्य) धीमा होगा। –

+0

ओह - तदनुसार उदाहरण अपडेट किया गया। पकड़ने के लिए धन्यवाद :) –

7

परावर्तक मैंने पाया का उपयोग कर कैसे आर, जी, बी मानक .net कॉल (सिल्वरलाइट में उपलब्ध नहीं) में पार्स किया जाता है:

System.Drawing.ColorTranslator.FromWin32() 
से है कि मैं कैसे अल्फ़ा चैनल के रूप में अच्छी तरह से प्राप्त करने के लिए अनुमान लगाया

, और यह काम करता है:

Color c2 = Color.FromArgb((byte)((colorAsInt >> 0x18) & 0xff), 
          (byte)((colorAsInt >> 0x10) & 0xff), 
          (byte)((colorAsInt >> 8) & 0xff), 
          (byte)(colorAsInt & 0xff)); 
2

क्या कवर नहीं किया गया है WriteableBitmap का उपयोग करता है premultiplied ARGB32 है, इसलिए यदि आप एक अर्द्धपारदर्शी पिक्सेल आर, जी, और बी मूल्यों अल्फा मूल्य 0 से मापा जाता है।

कलर वैल्यू वापस पाने के लिए, आपको विपरीत करने की आवश्यकता है और इसे 0 से 255 तक स्केल करना होगा। नीचे दिखाए गए कुछ।

r = (byte)(r * (255d/alpha)) 
0
public static Color ToColor(this uint argb) 
{ 
    return Color.FromArgb((byte)((argb & -16777216) >> 0x18), 
          (byte)((argb & 0xff0000) >> 0x10), 
          (byte)((argb & 0xff00) >> 8), 
          (byte)(argb & 0xff)); 
} 

और का उपयोग कर:

Color c = colorAsInt.ToColor() 
0

मुझे लगता है कि कुछ इस तरह काम करना चाहिए:

public byte[] GetPixelBytes(WriteableBitmap bitmap) 
{ 
    int[] pixels = bitmap.Pixels; 
    int length = pixels.Length * 4; 
    byte[] result = new byte[length]; // ARGB 
    Buffer.BlockCopy(pixels, 0, result, 0, length); 
    return result; 
} 

एक बार जब आप बाइट्स है, रंग हो रही विभिन्न से किसी के साथ आसान है रंग एपीआई।