Conversione di un’immagine JPEG in un array di byte – Eccezione COM

Usando C #, sto provando a caricare un file JPEG dal disco e convertirlo in un array di byte. Finora, ho questo codice:

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, l’esecuzione della riga ARGH mi dà il messaggio:

COMException non è stato gestito. L’handle non è valido. (Eccezione da HRESULT: 0x80070006 (E_HANDLE))

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

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

Inoltre è meglio usare 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(); } 

Altro suggerimento:

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

Dovrebbe funzionare non solo con le immagini.

 public byte[] imageToByteArray(System.Drawing.Image imageIn) { MemoryStream ms = new MemoryStream(); imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif); return ms.ToArray(); } 

Il motivo per cui questo errore si verifica è dovuto al fatto che il metodo BitmapFrame.Create () viene utilizzato per impostazione predefinita su un carico OnDemand. BitmapFrame non tenta di leggere il stream a cui è associato fino alla chiamata a encoder.Save, in base al quale il stream è già disposto.

Puoi avvolgere l’intera funzione nel blocco {} o utilizzare un BitmapFrame.Create () alternativo, ad esempio:

 BitmapFrame.Create(fs, BitmapCreateOptions.None, BitmapCacheOption.OnLoad);