Come semplificare questo codice MemoryStream
-
05-07-2019 - |
Domanda
Questo codice restituisce una miniatura di un'immagine caricata da un array di byte. Sto cercando di capire perché l'autore sta usando 4 flussi di memoria e se esiste un modo semplice per riscriverlo o se va bene così com'è.
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);
}
}
}
}
}
Soluzione
In realtà sta usando solo 3 MemoryStreams qui, ma deve usare solo 2 (credo). Dovresti essere in grado di sostituire questo codice:
using (MemoryStream m = new MemoryStream(ms.ToArray()))
{
return Image.FromStream(m, true);
}
con questo:
ms.Seek(0, SeekOrigin.Begin);
return Image.FromStream(ms, true);
Penso che abbia creato il terzo MemoryStream perché il ms
MemoryStream non era all'inizio.
Altri suggerimenti
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; } } }
Penso che andrà bene
Penso che mancino le risposte precedenti che l'autore sta forzando una conversione in jpeg.
Penso che l'ultimo, m
, possa essere eliminato. Basta reimpostare ms.Position = 0
sarebbe sufficiente. Si noti che i risparmi principali eliminerebbero ms.ToArray ()
.
Gli altri MemoryStreams sembrano necessari, o almeno c'è poco da guadagnare eliminandoli o riutilizzandoli.