2011-09-14 11 views
15

सी # का उपयोग करके, मैं डिस्क से एक जेपीईजी फ़ाइल लोड करने और इसे बाइट सरणी में बदलने की कोशिश कर रहा हूं।एक जेपीईजी छवि को बाइट सरणी में परिवर्तित करना - COM अपवाद

COMException बिना क्रिया था:

static void Main(string[] args) 
{ 
    System.Windows.Media.Imaging.BitmapFrame bitmapFrame; 

    using (var fs = new System.IO.FileStream(@"C:\Lenna.jpg", FileMode.Open)) 
    { 
     bitmapFrame = BitmapFrame.Create(fs); 
    } 

    System.Windows.Media.Imaging.BitmapEncoder encoder = 
     new System.Windows.Media.Imaging.JpegBitmapEncoder(); 
    encoder.Frames.Add(bitmapFrame); 

    byte[] myBytes; 
    using (var memoryStream = new System.IO.MemoryStream()) 
    { 
     encoder.Save(memoryStream); // Line ARGH 

     // mission accomplished if myBytes is populated 
     myBytes = memoryStream.ToArray(); 
    } 
} 

हालांकि, क्रियान्वित लाइन ARGH मुझे संदेश देता है: अब तक, मैं इस कोड है। हैंडल अमान्य है। ( HRESULT से अपवाद: 0x80070006 (E_HANDLE))

मुझे नहीं लगता कि कुछ भी फ़ाइल Lenna.jpg के बारे में विशेष है - मैं http://computervision.wikia.com/wiki/File:Lenna.jpg से डाउनलोड। क्या आप बता सकते हैं कि उपर्युक्त कोड में क्या गलत है?

उत्तर

3

वर्गों का उपयोग करने के कारण इस त्रुटि होता है बेहतर है क्योंकि आप को चूक का उपयोग कर रहे BitmapFrame.Create() विधि एक ऑन डिमांड लोड। बिटमैपफ्रेम उस स्ट्रीम को पढ़ने की कोशिश नहीं करता है, जब तक कि एन्कोडर को कॉल तक कनेक्ट नहीं किया जाता है। बचाओ, जिस बिंदु से स्ट्रीम पहले ही डिस्पोजेड हो चुकी है।

आप या तो का उपयोग कर {} ब्लॉक में पूरे समारोह लपेट सकता है, या एक वैकल्पिक BitmapFrame.Create() इस तरह के रूप में उपयोग,:

BitmapFrame.Create(fs, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
4
public byte[] imageToByteArray(System.Drawing.Image imageIn) 
{ 
MemoryStream ms = new MemoryStream();  

imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); 
return ms.ToArray(); 
} 
7

अन्य सुझाव:

byte[] image = System.IO.File.ReadAllBytes (Server.MapPath ("noimage.png")); 

न केवल छवियों के साथ काम करना चाहिए।

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