2010-01-19 13 views
22

मुझे BitmapImage को MemoryStream से MemoryStream से वेब अनुरोध से प्राप्त पीएनजी और जीआईएफ बाइट्स से कुछ परेशानी हो रही है। बाइट्स को ठीक से डाउनलोड किया प्रतीत होता है और BitmapImage ऑब्जेक्ट बिना किसी समस्या के बनाया गया है हालांकि छवि वास्तव में मेरे UI पर प्रतिपादन नहीं कर रही है। समस्या तब होती है जब डाउनलोड की गई छवि प्रकार पीएनजी या gif (जेपीईजी के लिए ठीक काम करता है) है।मेमोरीस्ट्रीम पीएनजी से जीपीएफ बिटमैप इमेज बनाना, gif

यहाँ कोड है कि समस्या को दर्शाता है है:

var webResponse = webRequest.GetResponse(); 
var stream = webResponse.GetResponseStream(); 
if (stream.CanRead) 
{ 
    Byte[] buffer = new Byte[webResponse.ContentLength]; 
    stream.Read(buffer, 0, buffer.Length); 

    var byteStream = new System.IO.MemoryStream(buffer); 

    BitmapImage bi = new BitmapImage(); 
    bi.BeginInit(); 
    bi.DecodePixelWidth = 30; 
    bi.StreamSource = byteStream; 
    bi.EndInit(); 

    byteStream.Close(); 
    stream.Close(); 

    return bi; 
} 

कि वेब अनुरोध सही ढंग से बाइट्स मैं जिसके बाद डिस्क पर एक फ़ाइल में बाइट्स की बचत होती है की कोशिश की प्राप्त किया गया था परीक्षण करने के लिए और फिर एक का उपयोग कर छवि लोड UriSource बल्कि एक StreamSource से और यह सब छवि प्रकार के लिए काम करता है:

var webResponse = webRequest.GetResponse(); 
var stream = webResponse.GetResponseStream(); 
if (stream.CanRead) 
{ 
    Byte[] buffer = new Byte[webResponse.ContentLength]; 
    stream.Read(buffer, 0, buffer.Length); 

    string fName = "c:\\" + ((Uri)value).Segments.Last(); 
    System.IO.File.WriteAllBytes(fName, buffer); 

    BitmapImage bi = new BitmapImage(); 
    bi.BeginInit(); 
    bi.DecodePixelWidth = 30; 
    bi.UriSource = new Uri(fName); 
    bi.EndInit(); 

    stream.Close(); 

    return bi; 
} 

किसी को भी चमक के किसी भी प्रकाश मिल गया?

उत्तर

43

bi.CacheOption = BitmapCacheOption.OnLoad जोड़े सीधे करने के बाद अपने .BeginInit():

BitmapImage bi = new BitmapImage(); 
bi.BeginInit(); 
bi.CacheOption = BitmapCacheOption.OnLoad; 
... 

इस के बिना, बिटमैप छवि डिफ़ॉल्ट रूप से आलसी प्रारंभिकता का उपयोग करती है और तब तक स्ट्रीम बंद हो जाएगी। पहले उदाहरण में आप कचरा-एकत्रित बंद या यहां तक ​​कि डिस्प्ले मेमोरीस्ट्रीम से छवि को पढ़ने का प्रयास करते हैं। दूसरा उदाहरण फ़ाइल का उपयोग करता है, जो अभी भी उपलब्ध है। नई MemoryStream (imageBytes) मैं बदल CacheOption बेहतर है लगता है, इस तरह के चाहिए: इसके अलावा,

var byteStream = new System.IO.MemoryStream(buffer); 

बेहतर

using (MemoryStream byteStream = new MemoryStream(buffer)) 
{ 
    ... 
} 
+6

'बिटमैप कैशऑप्शन.ऑनलोड 'चाल महत्वपूर्ण है। मैं बस यह जोड़ना चाहूंगा कि यह 'BeginInit() 'और' EndInit()' के बीच होना चाहिए। –

+0

@ PieterMüller: बहुत उपयोगी सुराग; इसके अलावा, स्ट्रीम अभी भी * EndInit() 'को कॉल करते समय खुले रहना चाहिए क्योंकि एक और बाधा है जिसे आप ठोकर खा सकते हैं। –

10

मैं इस कोड का उपयोग कर रहा:

public static BitmapImage GetBitmapImage(byte[] imageBytes) 
{ 
    var bitmapImage = new BitmapImage(); 
    bitmapImage.BeginInit(); 
    bitmapImage.StreamSource = new MemoryStream(imageBytes); 
    bitmapImage.EndInit(); 
    return bitmapImage; 
} 

हो सकता है आप इस लाइन को हटाना चाहिए:

bi.DecodePixelWidth = 30; 
+1

लेकिन क्या है कि आप के द्वारा बनाई गई स्मृति धारा बंद करने के बारे कुछ भी न लिखें धाराओं के रूप में बंद कर दिया? –

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