Установка источника изображения вызывает утечку памяти (wpf, c #) - PullRequest
2 голосов
/ 07 мая 2019

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

Сценарий:

В какой-то момент страница создается, и она создает BitMap и рисует композицию изображений и шаблон навески.Это изображение должно быть показано в программе, поэтому я преобразую растровое изображение в BitmapSource для установки Controls.Image.Source

Code:

Bitmap bi = new Bitmap(rect.Width, rect.Height);
Graphics g = Graphics.FromImage(bi);

[paint some stuff here]

BitmapSource bs = ImageUtils.SourceFromBitmap(bi);
canvas.Source = bs; //PROBLEM HERE

[Dispose g and bi]

Чтобы уточнить, используемые здесь методы:

public static BitmapSource SourceFromBitmap(Bitmap bmp)
{
    var hbm = bmp.GetHbitmap();
    try
    {
        BitmapSource result = Imaging.CreateBitmapSourceFromHBitmap(hbm, IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
        return result;
    }
    finally { DeleteObject(hbm);}
}

[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern bool DeleteObject(IntPtr hObject);

Проблема

Первый тест, который я сделал, это прокомментировать строку canvas.Source = bs; , где canvas - это имя System.Windows.Controls.Image

Если я это сделаю, использование памяти не увеличится.

Пробовал

Я искал некоторую информацию, и большинство случаев это связано с BitmapImage, но я им не пользуюсь.

Я пытался использовать метод freeze с BitmapSouce bs после и до его установки в качестве источника, но результат тот же.

 BitmapSource bs = ImageUtils.SourceFromBitmap(bi);
 bs.Freeze();
 canvas.Source = bs;
 BitmapSource bs = ImageUtils.SourceFromBitmap(bi);
 canvas.Source = bs;
 bs.Freeze();

Я также пытался использовать GC.Collect () непосредственно перед переназначением canvas.source, но результат тот же.

Я пытался использовать GC.Collect () после закрытия страницы, но результат тот же.

Единственный способ устранить утечку памяти - этокомментируя строку, но это не решение ...

Справка:

Что я могу сделать?

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