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?
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();
}
Autre suggestion:
byte[] image = System.IO.File.ReadAllBytes ( Server.MapPath ( "noimage.png" ) );
Devrait fonctionner non seulement avec des images.
public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
MemoryStream ms = new MemoryStream();
imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
return ms.ToArray();
}
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);