J'ai des données binaires que je veux sauvegarder comme une image. Lorsque j'essaie d'enregistrer l'image, une exception est levée si le flux de mémoire utilisé pour créer l'image a été fermé avant l'enregistrement. La raison pour laquelle je fais cela est que je crée des images de façon dynamique et qu'en tant que tel, je dois utiliser un flux de mémoire.
voici le code :
[TestMethod]
public void TestMethod1()
{
// Grab the binary data.
byte[] data = File.ReadAllBytes("Chick.jpg");
// Read in the data but do not close, before using the stream.
Stream originalBinaryDataStream = new MemoryStream(data);
Bitmap image = new Bitmap(originalBinaryDataStream);
image.Save(@"c:\test.jpg");
originalBinaryDataStream.Dispose();
// Now lets use a nice dispose, etc...
Bitmap2 image2;
using (Stream originalBinaryDataStream2 = new MemoryStream(data))
{
image2 = new Bitmap(originalBinaryDataStream2);
}
image2.Save(@"C:\temp\pewpew.jpg"); // This throws the GDI+ exception.
}
Quelqu'un a-t-il une idée de la façon dont je pourrais sauvegarder une image avec le flux fermé ? Je ne peux pas compter sur les développeurs pour se souvenir de fermer le flux après l'enregistrement de l'image. En fait, le développeur n'aurait AUCUNE idée que l'image a été générée en utilisant un flux de mémoire (parce que cela se produit dans un autre code, ailleurs).
Je suis vraiment confus :(
1 votes
J'ai reçu ce commentaire de @HansPassant dans un autre message. question . Vous obtiendrez cette exception chaque fois que le codec aura des difficultés à écrire le fichier. Une bonne instruction de débogage à ajouter est System.IO.File.WriteAllText(path, "test") avant l'appel Save(), elle vérifie la capacité de base à créer le fichier. Vous obtiendrez maintenant une bonne exception qui vous dira ce que vous avez fait de mal.
0 votes
Vous devriez image2.Save à l'intérieur
using
bloc. Je pense que leoriginalBinaryDataStream2
a été automatiquement éliminé à la fin de l'utilisation. Et c'est ce qui a déclenché l'exception.