Как упростить этот код MemoryStream - PullRequest
2 голосов
/ 22 октября 2009

Этот код возвращает миниатюру изображения, загруженного из байтового массива. Я пытаюсь понять, почему автор использует 4 потока памяти, и если есть простой способ переписать это или это нормально, так оно и есть.

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);
                }
            }
        }
   }
}

Ответы [ 4 ]

3 голосов
/ 22 октября 2009

Он на самом деле использует только 3 MemoryStreams здесь, но ему нужно использовать только 2 (я думаю). Вы должны быть в состоянии заменить этот код:

using (MemoryStream m = new MemoryStream(ms.ToArray()))                
{                    
    return Image.FromStream(m, true);                
}

с этим:

ms.Seek(0, SeekOrigin.Begin);
return Image.FromStream(ms, true);

Я думаю, что он создал третий MemoryStream, потому что ms MemoryStream не был в начале.

1 голос
/ 22 октября 2009

Я думаю, что последнее, m, может быть устранено. Простого сброса ms.Position=0 будет достаточно. Обратите внимание, что основные сбережения будут устранены ms.ToArray().

Другие MemoryStreams выглядят необходимыми, или, по крайней мере, мало что можно получить, устраняя или повторно используя их.

1 голос
/ 22 октября 2009

Я думаю, что предыдущие ответы отсутствуют, что автор принудительно конвертирует в JPEG.

1 голос
/ 22 октября 2009
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;
        }
   }
}

я думаю, что это будет правильно

...