2012-01-31 3 views
14

मैं एक MemoryStream में एक छवि को बचाने के लिए कोशिश कर रहा हूँ, लेकिन यह कुछ शर्तों के अधीन विफल हो रहा है।Image.Save क्रैश होने: { "मूल्य खाली नहीं रह सकती r nParameter नाम:। एनकोडर"}

निम्नलिखित कोड सफल होता है:

Image img = Bitmap.FromStream(fileStream); 
MemoryStream ms = new MemoryStream(); 
img.Save(ms, img.RawFormat); // This succeeds. 

निम्न कोड में विफल रहता है:

Image img = Bitmap.FromStream(fileStream); 
Image thumb = img.GetThumbnailImage(thumbWidth, thumbHeight, null, System.IntPtr.Zero); 

MemoryStream ms = new MemoryStream(); 
thumb.Save(ms, thumb.RawFormat); // This fails. 

सूचना है कि दूसरी टुकड़ा एक छवि का उपयोग कर रहा बनाया Image.GetThumbnailImage का उपयोग कर

यहाँ कोड है।

क्या अंतर है? क्या किसी को कोई विचार है कि यह क्यों विफल रहा है?

उत्तर

22

मेरा मानना ​​है कि समस्या GetThumbnailImage documentation के इस हिस्से से है:

Image एक एम्बेडेड थंबनेल छवि है, तो इस विधि एम्बेडेड थंबनेल प्राप्त करता है और अनुरोध किया आकार के लिए यह मापता है। यदि Image में एक एम्बेडेड थंबनेल छवि नहीं है, तो यह विधि मुख्य छवि को स्केल करके एक थंबनेल छवि बनाता है।

यह शायद अंतःक्रियात्मक व्यवहार (AKA "कुछ शर्तों") के लिए जिम्मेदार है। स्पष्टीकरण निम्नलिखित Microsoft Connect ticket में है:

अंतर्निहित API MemoryBmp छवि प्रकार के लिए एन्कोडर का पता लगाने में सक्षम नहीं है। हमें जीडीआई + टीम की जांच करने की आवश्यकता होगी। इस बीच, आप ImageFormat.MemoryBmp की बजाय ImageFormat.Bmp पर अपनी छविफॉर्मैट को बस बदलने में सक्षम होना चाहिए और इसे काम करना चाहिए। यह अभी भी बीएमपी प्रारूप का उपयोग कर मेमोरीस्ट्रीम में सहेजा जाएगा। इस प्रकार विशिष्ट त्रुटि संदेश आप देख रहे हैं -

सभी संभावना में, अगर कोई एम्बेडेड थंबनेल, GetThumbnailImage एपीआई द्वारा उत्पन्न नई झलक है वास्तव में MemoryBmp जो कोई जुड़े एनकोडर है की एक RawFormat करने जा रहा है ।

बस thumb.RawFormat का प्रयोग नहीं करते; चूंकि आप जानते हैं कि यह एक बिटमैप है, वैसे भी ImageFormat.Bmp का उपयोग करें।

पीएस कृपया ध्यान दें कि हालांकि मैं अपने पहले उत्तर हटा दिया गया क्योंकि यह नहीं निकला इस विशेष मुद्दे के लिए प्रासंगिक हो, यह अभी भी रूप में प्रलेखन निर्दिष्ट करता है ठीक से GetThumbnailImage एपीआई का उपयोग करने के लिए महत्वपूर्ण है; आप null के बजाय callback पैरामीटर के लिए एक वैध प्रतिनिधि पास कर सकते हैं, अन्यथा यह असफल हो सकता है, और आपको अभी भी using खंडों में डिस्पोजेबल लपेटने की आवश्यकता है।

+1

बदलते 'thumb.Save (एमएस, thumb.RawFormat)' 'thumb.Save करने के लिए (एमएस, thumb.Bmp)' यह किया! – agarcian

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