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);
                }
            }
        }
   }
}
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top