2011-09-14 3 views
15

Utilizzando C#, sto provando a caricare un file JPEG dal disco e convertirlo in un array di byte. Finora, non ho questo codice:Conversione di un'immagine JPEG in un array di byte - Eccezione COM

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(); 
    } 
} 

Tuttavia, mi eseguendo linea ARGH dà il messaggio:

COMException è stata gestita. L'handle non è valido. (Eccezione da HRESULT: 0x80070006 (E_HANDLE))

Non credo che ci sia qualcosa di speciale per il file di Lenna.jpg - ho scaricato da http://computervision.wikia.com/wiki/File:Lenna.jpg. Puoi dire cosa c'è di sbagliato nel codice sopra?

risposta

36

Controllare gli esempi di questo articolo: http://www.codeproject.com/KB/recipes/ImageConverter.aspx

Inoltre è meglio utilizzare le classi da System.Drawing

Image img = Image.FromFile(@"C:\Lenna.jpg"); 
byte[] arr; 
using (MemoryStream ms = new MemoryStream()) 
{ 
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
    arr = ms.ToArray(); 
} 
3

La ragione per cui questo errore accade è perché il metodo BitmapFrame.Create() si utilizza il valore predefinito un carico OnDemand. BitmapFrame non tenta di leggere il flusso a cui è associato fino alla chiamata a encoder.Save, in base al quale il flusso è già disposto.

Si potrebbe o avvolgere l'intera funzione nella utilizzando blocco {}, o utilizzare un BitmapFrame.Create alternativo(), come ad esempio:

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

Altro suggerimento:

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

Dovrebbe funzionare non solo con le immagini.