2009-12-05 10 views
6

मैं सिल्वरलाइट और डब्ल्यूसीएफ सेवा के बीच एक छवि के कुछ प्रतिनिधित्व को आगे बढ़ाने की कोशिश कर रहा हूं। यदि संभव हो तो मैं System.Windows.Media.Imaging.BitmapImage पास करना चाहता हूं, क्योंकि इसका मतलब यह होगा कि क्लाइंट को कोई रूपांतरण नहीं करना है।क्या मैं सिल्वरलाइट में बिटमैप इमेज से बाइट [] प्राप्त कर सकता हूं?

हालांकि, किसी बिंदु पर मुझे इस छवि को डेटाबेस में संग्रहीत करने की आवश्यकता है, जिसका अर्थ है कि छवि प्रतिनिधित्व byte[] में कनवर्ट करने में सक्षम होना चाहिए। मैं सेका उपयोग करके से बना सकता हूं और BitmapImage.SetSource() का उपयोग कर। लेकिन मुझे अन्य तरीकों को बदलने का कोई तरीका नहीं दिख रहा है - BitmapImage से byte[] तक। क्या में यहां कुछ भूल रहा हूँ?

यदि यह बिल्कुल मदद करता है, तो रूपांतरण कोड सर्वर पर चलाया जा सकता है, यानी इसे सिल्वरलाइट-सुरक्षित होने की आवश्यकता नहीं है।

+0

आप कभी भी इस के लिए एक समाधान मिला? –

+0

नहीं। शुरुआत में उपयोगकर्ता को ओपन डायलॉग बॉक्स में चुनने वाले उपयोगकर्ता के माध्यम से लोड किया जा रहा था। वर्कअराउंड openDialog.File.OpenRead तक पहुंचने के लिए था, उस स्ट्रीम से एक बाइनरी रीडर बनाएं, फिर बाइट [] प्राप्त करने के लिए पाठक पर ReadBytes() को कॉल करें। मैं सिल्वरलाइट 4 के साथ नहीं रह रहा हूं, अब एक समाधान उपलब्ध हो सकता है। – goric

उत्तर

6

इस का उपयोग करें:

public byte[] GetBytes(BitmapImage bi) 
{ 
    WriteableBitmap wbm = new WriteableBitmap(bi); 
    return wbm.ToByteArray(); 
} 

कहाँ

public static byte[] ToByteArray(this WriteableBitmap bmp) 
{ 
    // Init buffer 
    int w = bmp.PixelWidth; 
    int h = bmp.PixelHeight; 
    int[] p = bmp.Pixels; 
    int len = p.Length; 
    byte[] result = new byte[4 * w * h]; 

    // Copy pixels to buffer 
    for (int i = 0, j = 0; i < len; i++, j += 4) 
    { 
     int color = p[i]; 
     result[j + 0] = (byte)(color >> 24); // A 
     result[j + 1] = (byte)(color >> 16); // R 
     result[j + 2] = (byte)(color >> 8); // G 
     result[j + 3] = (byte)(color);  // B 
    } 

    return result; 
} 
0

CopyPixels का उपयोग करने का प्रयास करें। आप बिटमैप डेटा को बाइट सरणी में कॉपी कर सकते हैं। हालांकि, मैं ईमानदारी से यह सुनिश्चित नहीं कर रहा हूं कि पिक्सेल का प्रारूप क्या होगा ... यह शायद मूल रूप से लोड की गई छवि की तरह निर्भर करता है।

+0

आपके द्वारा लिंक किया गया पृष्ठ सामान्य रूप से .NET के लिए है, बिटमैपसोर्स (System.Windows.dll में) का सिल्वरलाइट संस्करण इस विधि का समर्थन नहीं करता है: http://msdn.microsoft.com/en-us/library/system .windows.media.imaging.bitmapsource% 28VS.95% 29.aspx – goric

+0

ओह, क्षमा करें। मैं भूल गया कि सिल्वरलाइट और डब्ल्यूपीएफ अभी तक काफी समान नहीं हैं। – jrista

1

मैं एक ही मुद्दा था। मुझे ImageTools library मिला जो थेट नौकरी के तरीके को आसान बनाता है।

पुस्तकालय जाओ और इसे संदर्भ और फिर

     using (var writingStream = new MemoryStream()) 
         { 
          var encoder = new PngEncoder 
          { 
           IsWritingUncompressed = false 
          }; 
          encoder.Encode(bitmapImageInstance, writingStream); 
          // do something with the array 
         } 
संबंधित मुद्दे