2011-09-14 8 views
15

Utilizando C#, estoy tratando de cargar un archivo JPEG desde el disco y convertirlo a una matriz de bytes. Hasta el momento, no tengo este código:Convertir una imagen JPEG a una matriz de bytes - Excepción 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(); 
    } 
} 

Sin embargo, la ejecución de la línea me ARGH da el mensaje:

COMException fue controlada. El mango no es válido. (Excepción de HRESULT : 0x80070006 (E_HANDLE))

No creo que haya nada de especial en el archivo Lenna.jpg - He descargado desde http://computervision.wikia.com/wiki/File:Lenna.jpg. ¿Puedes decir qué está mal con el código anterior?

Respuesta

36

Comprobar los ejemplos de este artículo: http://www.codeproject.com/KB/recipes/ImageConverter.aspx

También es mejor usar las clases de 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 razón sucede este error se debe a que el método BitmapFrame.Create() se utiliza por defecto una carga a petición. El BitmapFrame no intenta leer la secuencia a la que está asociado hasta la llamada al codificador. Guardar, en cuyo punto la transmisión ya está eliminada.

Usted podría envolver la función entera en el bloque usando {}, o utilizar una alternativa BitmapFrame.Create(), tales como:

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

Otra sugerencia:

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

debería funcionar no solo con imágenes.

Cuestiones relacionadas