Comment simplifier ce code MemoryStream
-
05-07-2019 - |
Question
Ce code retourne une vignette d'une image chargée à partir d'un tableau d'octets. J'essaie de comprendre pourquoi l'auteur utilise 4 flux de mémoire et s'il existe un moyen simple de le récrire ou s'il est correct tel qu'il est.
public Image GetThumbnail(int height, int width)
{
//load the image from a byte array (imageData)
using (MemoryStream mem = new MemoryStream(this.imageData))
{
// Create a Thumbnail from the image
using (Image thumbPhoto = Image.FromStream(mem,
true).GetThumbnailImage(height, width, null,
new System.IntPtr()))
{
// Convert the Image object to a byte array
using (MemoryStream ms = new MemoryStream())
{
thumbPhoto.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
using (MemoryStream m = new MemoryStream(ms.ToArray()))
{
return Image.FromStream(m, true);
}
}
}
}
}
La solution
En fait, il n’utilise que 3 MemoryStreams ici, mais il n’en utilise que 2 (je pense). Vous devriez pouvoir remplacer ce code:
using (MemoryStream m = new MemoryStream(ms.ToArray()))
{
return Image.FromStream(m, true);
}
avec ceci:
ms.Seek(0, SeekOrigin.Begin);
return Image.FromStream(ms, true);
Je pense qu’il a créé le troisième MemoryStream car le ms
MemoryStream n’était pas au début.
Autres conseils
public Image GetThumbnail(int height, int width) { //load the image from a byte array (imageData) using (MemoryStream mem = new MemoryStream(this.imageData)) { // Create a Thumbnail from the image using (Image thumbPhoto = Image.FromStream(mem, true).GetThumbnailImage(height, width, null, new System.IntPtr())) { return thumbPhoto; } } }
Je pense que cela sera juste
Je pense qu'il manque aux réponses précédentes que l'auteur force une conversion en jpeg.
Je pense que le dernier, m
, peut être éliminé. Réinitialiser simplement ms.Position = 0
serait suffisant. Notez que les principales économies consisteraient à éliminer le ms.ToArray ()
.
Les autres MemoryStreams semblent nécessaires, ou du moins, il y a peu à gagner en les éliminant ou en les réutilisant.