2009-12-24 9 views
6

मैं एक छवि के लिए एक बाइट [] बदलने में सक्षम हूं:सिल्वरलाइट: छवि बाइट के लिए []

byte[] myByteArray = ...; // ByteArray to be converted 

MemoryStream ms = new MemoryStream(my); 
BitmapImage bi = new BitmapImage(); 
bi.SetSource(ms); 

Image img = new Image(); 
img.Source = bi; 

लेकिन मैं छवि एक बाइट [] के लिए वापस बदलने में सक्षम नहीं कर रहा हूँ!

var bmp = img.Source as BitmapImage; 
int height = bmp.PixelHeight; 
int width = bmp.PixelWidth; 
int stride = width * ((bmp.Format.BitsPerPixel + 7)/8); 

byte[] bits = new byte[height * stride]; 
bmp.CopyPixels(bits, stride, 0); 

सिल्वरलाइट पुस्तकालय इतना छोटा वर्ग BitmapImage कोई संपत्ति बुलाया स्वरूप है कि: मैं एक समाधान है, कि WPF लिए काम करता है इंटरनेट में मिल गया!

क्या कोई ऐसा विचार है जो मेरी समस्या का समाधान करता है।

मैंने समाधान खोजने के लिए लंबे समय तक इंटरनेट पर खोज की, लेकिन कोई समाधान नहीं है, जो चांदी की रोशनी में काम करता है!

धन्यवाद!

उत्तर

7

(पिक्सेल विधि बिट्स प्रति आप याद कर रहे हैं बस में वर्णन है कि रंग जानकारी पिक्सेल प्रति संग्रहीत किया जाता है)

के रूप में एंथनी का सुझाव दिया, एक WriteableBitmap सबसे आसान तरीका हो सकता है - एक ARGB प्राप्त करने के लिए एक विधि के लिए http://kodierer.blogspot.com/2009/11/convert-encode-and-decode-silverlight.html की जाँच बाइट सरणी आउट:

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; 
} 
3

कोई समाधान नहीं है जो डिजाइन द्वारा सिल्वरलाइट में काम करता है। किसी भी क्रॉस डोमेन एक्सेस पॉलिसी के अनुरूप होने के बिना छवियों को पुनर्प्राप्त किया जा सकता है क्योंकि अन्य http अनुरोधों को करना है। क्रॉस डोमेन नियमों के इस विश्राम का आधार यह है कि छवि को बनाने वाले डेटा को कच्चे में पुनर्प्राप्त नहीं किया जा सकता है। इसे केवल एक छवि के रूप में इस्तेमाल किया जा सकता है।

यदि आप बस बिटमैप छवि से लिखना और पढ़ना चाहते हैं तो के बजाय WriteableBitmap कक्षा का उपयोग करें। WriteableBitmapPixels संपत्ति BitmapImage पर उपलब्ध नहीं है।

2
public static void Save(this BitmapSource bitmapSource, Stream stream) 
    { 
     var writeableBitmap = new WriteableBitmap(bitmapSource); 

     for (int i = 0; i < writeableBitmap.Pixels.Length; i++) 
     { 
      int pixel = writeableBitmap.Pixels[i]; 

      byte[] bytes = BitConverter.GetBytes(pixel); 
      Array.Reverse(bytes); 

      stream.Write(bytes, 0, bytes.Length); 
     } 
    } 

    public static void Load(this BitmapSource bitmapSource, byte[] bytes) 
    { 
     using (var stream = new MemoryStream(bytes)) 
     { 
      bitmapSource.SetSource(stream); 
     } 
    } 

    public static void Load(this BitmapSource bitmapSource, Stream stream) 
    { 
     bitmapSource.SetSource(stream); 
    } 
+0

आप इस काम की है? विशेष रूप से bitmapSource.SetSource (स्ट्रीम); अंश? मेरे लिए अपवाद फेंकता है। – jayarjo

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