web-dev-qa-db-fra.com

Conversion d'une image JPEG en un tableau d'octets - exception COM

En utilisant C #, j'essaie de charger un fichier JPEG à partir du disque et de le convertir en un tableau d'octets. Jusqu'à présent, j'ai ce code:

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

Cependant, l'exécution de la ligne ARGH me donne le message:

COMException n'a pas été gérée. Le handle n'est pas valide. (Exception de HRESULT: 0x80070006 (E_HANDLE))

Je ne pense pas qu'il y ait quelque chose de spécial dans le fichier Lenna.jpg - Je l'ai téléchargé depuis http://computervision.wikia.com/wiki/File:Lenna.jpg . Pouvez-vous dire ce qui ne va pas avec le code ci-dessus?

20
user181813

Consultez les exemples de cet article: http://www.codeproject.com/KB/recipes/ImageConverter.aspx

Il est également préférable d'utiliser des classes 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();
}
46
Samich

Autre suggestion:

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

Devrait fonctionner non seulement avec des images.

13
Hristo
public byte[] imageToByteArray(System.Drawing.Image imageIn)  
{   
 MemoryStream ms = new MemoryStream();     

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

La raison pour laquelle cette erreur se produit est que la méthode BitmapFrame.Create () que vous utilisez par défaut pour un chargement OnDemand. Le BitmapFrame n'essaie pas de lire le flux auquel il est associé jusqu'à l'appel à encoder.Save, date à laquelle le flux est déjà supprimé.

Vous pouvez soit encapsuler la fonction entière dans le bloc using {}, soit utiliser un autre BitmapFrame.Create (), tel que:

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