WPF BitmapImage Использование памяти - PullRequest
4 голосов
/ 26 мая 2011

Я пытаюсь преобразовать байтовый массив изображения в BitmapImage для привязки к кнопке.

public static BitmapImage GetBitmapImageFromByteArray(byte[] p_Image)
    {
        try
        {
            BitmapImage bmpImage;
            if (p_Image != null)
            {
                using (MemoryStream msStream = new MemoryStream(p_Image))
                {
                    msStream.Position = 0;
                    bmpImage = GetBitmapImageFromStream(msStream);
                    //msStream.Close();
                    return bmpImage;
                }
            }
        }
        catch
        {
        }
        return null;
    }

Где GetBitmapImageFromStream выглядит примерно так:

public static BitmapImage GetBitmapImageFromStream(MemoryStream msImage)
    {
        try
        {
            if (msImage == null) return null;
                BitmapImage bmpImg = new BitmapImage();
                msImage.Position = 0;
                bmpImg.BeginInit();
                bmpImg.CacheOption = BitmapCacheOption.OnLoad;
                bmpImg.StreamSource = msImage;
                bmpImg.EndInit();
                return bmpImg;

        }
        catch
        {
            return null;
        }
    }

В bmpImg.EndInit (), это огромный скачок в памяти.И у меня есть много кнопок на моем интерфейсе, который вызывает проблему.Почему это происходит и как я могу это исправить или как восстановить память?

Спасибо.

Ответы [ 2 ]

1 голос
/ 26 мая 2011

Из справки я предполагаю, что она создает копию для ее кэширования, а возможно одну копию уменьшают, чтобы использовать ее на кнопке.И хотя GC не собирает все данные, скопированные в потоки, в памяти будет несколько копий.

0 голосов
/ 24 октября 2013

Попробуйте ограничить высоту вашего изображения.Вы можете установить свойство DecodePixelHeight в BitmapImage.Преобразование байтов займет некоторое время, но максимальная высота будет ограничена, а использование памяти уменьшится.

                var bmpImg = new BitmapImage();
                msImage.Position = 0;
                bmpImg.BeginInit();

                 bmpImg.DecodePixelHeight =containerHeight; 

                bmpImg.CacheOption = BitmapCacheOption.OnLoad;
                bmpImg.StreamSource = msImage;
                bmpImg.EndInit();
                return bmpImg;

Ps Возможно, у вас там будет утечка памяти.http://code.logos.com/blog/2008/04/memory_leak_with_bitmapimage_and_memorystream.html

...