2010-07-15 17 views

उत्तर

21

आप एक MemoryStream के माध्यम से जाना है, मूल रूप से:

public static byte[] IconToBytes(Icon icon) 
{ 
    using (MemoryStream ms = new MemoryStream()) 
    { 
     icon.Save(ms); 
     return ms.ToArray(); 
    } 
} 

public static Icon BytesToIcon(byte[] bytes) 
{ 
    using (MemoryStream ms = new MemoryStream(bytes)) 
    { 
     return new Icon(ms); 
    } 
} 

(ऐतिहासिक ध्यान दें:। मुझे यकीन है कि चाहे या नहीं यह धारा निर्माता के लिए पारित के निपटान के लिए सुरक्षित था नहीं था यह नहीं है । Bitmap के लिए ऐसा करने के लिए सुरक्षित, उदाहरण के लिए ... उस पर धारा को रखती है और बाद में इसे से पढ़ सकते हैं जाहिर है यह ठीक Icon के लिए हालांकि मुझे MSDN इस स्पष्ट कर दिया इच्छा ...)

+0

यह इंगित करने योग्य है कि बाइट्स "सहेजा गया" यहां फ़ाइल के लिखे गए बाइट्स के समान हैं (इसलिए इसमें फ़ाइल हेडर, कोई भी लागू संपीड़न आदि शामिल है) छवि के बाइट्स नहीं हैं। –

+0

हां, आप इसे एक बिटमैप बना सकते हैं और यदि आपको आवश्यकता हो तो पिक्सेल की सरणी निकालें। –

+0

बस उत्सुक है, आपने 'मेमोरीस्ट्रीम' को एक प्रयोग-ब्लॉक में अच्छी तरह से लपेट लिया है, आपने विपरीत बाइट्सटीओकॉन विधि में समान रूप से ऐसा क्यों नहीं किया? अब एमएस का निपटान करने की कोई ज़रूरत नहीं है? – Abel

1

देखें:। http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/1551fd3b-02b6-4479-852a-dfea4b610c35

पूर्व

private byte[] GetBytes(Icon icon) 
{ 
    MemoryStream ms = new MemoryStream(); 
    icon.Save(ms); 
    return ms.ToArray(); 
} 

और (वहाँ कई तरीके हैं):

Bitmap bmpIcon = icon.ToBitmap(); 

using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) 
{ 
    bmpIcon.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);   
    return ms.ToArray(); 
} 
+1

नहीं, 'गेटबफर' को कॉल न करें - जो अंत में अतिरिक्त 0s हो सकता है। 'ToArray' उपयोग करने के लिए सही कॉल है। –

+0

धन्यवाद, ध्यान दिया। मैं वास्तव में सिर्फ लिंक से सामान कॉपी किया। इसमें कई समाधान हैं। Google पर 20 सेकंड :) –

1

... और फिर से वापस

public static Icon IconFromBytes(byte[] bytes) { 
    using(var ms = new MemoryStream(bytes)) { 
      return new Icon(ms); 
    } 
} 

चिह्न वर्ग के रूप में जल्द ही यह है के रूप में धारा से पढ़ता का निर्माण किया। एमएस बंद करने में कोई नुकसान नहीं।

+0

+1 'उपयोग' का उपयोग करने के लिए +1 :) – Abel

+1

-1 यह समझने के लिए कि क्या निपटान() करता है। –

+0

विस्तृत करने के लिए देखभाल? मैं मानता हूं कि मेमोरीस्ट्रीम को निपटान की आवश्यकता नहीं है क्योंकि इसमें अप्रबंधित संसाधन नहीं हैं ... लेकिन यह IDISposable लागू होने पर निपटान को कॉल करने के पूरे विचार को मजबूत करता है। –

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