2012-01-06 6 views
13

मुझे एक छोटी सी समस्या है और मुझे कोई समाधान नहीं मिला है। मैं एक जीआईएफ को बाइट [] में बदलना चाहता हूं और फिर वापस एक जीआईएफ में बदलना चाहता हूं। मैं ठीक काम करता हूं लेकिन मैं एनीमेशन खो देता हूं।सी # gif छवि मेमोरीस्ट्रीम और पीछे (एनीमेशन खोना)

जब मैं शुरू करता हूं तो यह एक पूरी तरह से एनिमेटेड जीआईएफ है (मैं इसे PictureBox तत्व में दिखाता हूं)। लेकिन रूपांतरण के बाद मैं पहले फ्रेम के साथ फंस गया।

HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create("creativetechs.com/i/tip_images/ExampleAnimation.gif"); 
HttpWebResponse httpWebReponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
Stream stream = httpWebReponse.GetResponseStream(); 
Image img = Image.FromStream(stream); 

MemoryStream ms = new MemoryStream(); 
img.Save(ms,img.RawFormat); 
byte [] bytes = ms.ToArray(); 
Image img2 = Image.FromStream(new MemoryStream(bytes)); 

int frames1 = img.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time); 
int frames2 = img2.GetFrameCount(System.Drawing.Imaging.FrameDimension.Time); 

मैं भी RawFormat लेकिन System.Drawing.Imaging.ImageFormat.Gif नहीं का उपयोग करने की कोशिश की। एक चीज़ नहीं बदली frames1 फ्रेम की सही संख्या है। frames2 1.

मेरे पास मेरे जीयूआई में 2 PictureBox तत्व हैं। एक img और अन्य img2 दिखा रहा है। लेकिन img2 एनिमेटेड नहीं है जबकि img है। गलत क्या है?

मैंने अपने बाइट [] बनाने के बजाय क्रमबद्धता का उपयोग करने का भी प्रयास किया है।

मैंने छवि को क्रमबद्ध किया और इसे फिर से deserialized और यह कुछ भी नहीं बदला। यह कैसे संभव है?

+3

जीडीआई + जीआईएफ एन्कोडर SaveAdd() और न ही एनिमेटेड gifs का समर्थन नहीं करता है। –

+0

क्या आपने माना है कि यह जीआईएफ के साथ समस्या हो सकती है? मैंने बस इस [जीआईएफ] (http://www.creativetechs.com/iq/tip_images/ExampleAnimation.gif) के साथ अपने सटीक कोड की कोशिश की और इससे कोई समस्या नहीं हुई। 'Frames1' और' frames2' दोनों बराबर 17. –

+0

और मैं वेब प्रतिक्रिया स्ट्रीम से एनिमेटेड gif को लोड और विज़ुअलाइज़ करने में सक्षम क्यों हूं? –

उत्तर

9

जब आप Stream से अपनी छवि लोड करते हैं, तो .NET ढांचे का पता चलता है कि जीआईएफ एनिमेटेड है। चूंकि यह जानता है कि यह एनिमेटेड जीआईएफ को फिर से कोड करने में असमर्थ होगा, यह जीआईएफ के मूल एन्कोडिंग को स्टोर करने का प्रयास करता है। लेकिन यह के बाद होता है, इसने स्ट्रीम को पढ़ा है और जीआईएफ को डीकोड किया है। तो जब यह स्ट्रीम को रिवाइंड करने का प्रयास करता है तो यह असफल हो जाता है और यह मूल को संग्रहीत नहीं करता है।

जब आप Save() पर कॉल करते हैं तो यह पहले जांचता है कि इसमें मूल एन्कोडिंग संग्रहीत है या नहीं। लेकिन चूंकि वह ऑपरेशन विफल हुआ, यह जीआईएफ को फिर से कोड करने का प्रयास करता है। चूंकि .NET में एनिमेटेड जीआईएफ के लिए एन्कोडर नहीं है, यह केवल पहले फ्रेम को एन्कोड करता है।

यदि आप FileStream का उपयोग करते हैं तो यह काम करता है, क्योंकि FileStream खोजने योग्य है। आप देखो क्या होता है, .NET संदर्भ स्रोत डिबगिंग को सक्षम और ध्यान दें कि Image.EnsureSave में होता है चाहते हैं

// ... 
Stream stream = httpWebReponse.GetResponseStream(); 

MemoryStream memoryStream = new MemoryStream(); 
stream.CopyTo(memoryStream); 
memoryStream.Position = 0; 
stream = memoryStream; 

Image img = Image.FromStream(stream); 
// ... 

():

आप पहली बार एक MemoryStream में प्रतिक्रिया लोड करके अपने कोड काम कर सकते हैं । आप यह भी ध्यान देंगे कि छवि-कार्यान्वयन पहले ही स्ट्रीम को मेमोरीस्ट्रीम में कॉपी करता है, ताकि वे मूल स्ट्रीम के बजाय इसका उपयोग करके समस्या को ठीक कर सकें।

+0

वाह :)। अंत में वास्तव में एक अच्छी प्रतिक्रिया है। बहुत बहुत धन्यवाद। –

+0

रasmस: क्या आपका समाधान इस समस्या से पीड़ित नहीं होगा? http://support.microsoft.com/kb/814675 "इसके अतिरिक्त, यदि बिटमैप ऑब्जेक्ट के जीवन के दौरान स्ट्रीम नष्ट हो गई थी, तो आप स्ट्रीम पर आधारित छवि को सफलतापूर्वक एक्सेस नहीं कर सकते।" बिटमैप ऑब्जेक्ट स्ट्रीम का संदर्भ नहीं रखता है। अगर धारा का निपटारा किया जाता है, तो बिटमैप के संदर्भ विफल हो जाएंगे। नियमित बिटमैप्स के साथ काम करते समय आप इससे दूर हो जाएंगे, लेकिन यदि आप किसी स्ट्रीम से एनिमेटेड जीआईएफ बनाते हैं, तो एनिमेटेड जीआईएफ को फिर से चित्रित करने से कुछ सिस्टम विफल हो जाएंगे। – MindModel

2

GDI + किसी भी एनिमेटेड GIF एनकोडर (सिर्फ एक विकोडक) शामिल नहीं है। तो आपका img.Save एनीमेशन छोड़ देगा। लेकिन आप इसे आजमा सकते हैं: http://www.codeproject.com/KB/GDI-plus/NGif.aspx

+0

यदि आप फ़ाइल से gif लोड करते हैं तो यह पूरी तरह से काम करता है लेकिन यदि आप इसे http प्रतिक्रिया से लोड नहीं करते हैं। –

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