Утечка памяти в C # WPF при использовании Image.source - PullRequest
0 голосов
/ 30 июня 2018

Я получаю изображения с нескольких камер и просто помещаю объект Image в WPF. Но есть проблема утечки памяти. Вот код:

        for (int i = 0; i < grabResultsList.Count; i++)
        {


            int width = grabResultsList.ElementAt(i).Width;
            int height = grabResultsList.ElementAt(i).Height;
            byte[] pixels = grabResultsList.ElementAt(i).PixelData as byte[];
            byte[] pixelsnew = getNewByteArray(pixels, width, height);
            int stride = width / 2 * 3;

            BitmapSource bitmap = BitmapSource.Create(width / 2, height / 2, 96d, 96d, pf, null, pixelsnew, stride);

            StackPanel s = MainGrid.Children[i] as StackPanel;
            Image img = s.Children[0] as Image;

            img.Source = bitmap;


            grabResultsList.ElementAt(i).Dispose();
            GC.Collect();
        }

А вот график памяти, взятый из визуальной студии; CLICK HERE FOR IMAGE

Как видите, график RAM постоянно увеличивается.

Когда я комментирую эту строку img.Source = bitmap;

        for (int i = 0; i < grabResultsList.Count; i++)
        {


            int width = grabResultsList.ElementAt(i).Width;
            int height = grabResultsList.ElementAt(i).Height;
            byte[] pixels = grabResultsList.ElementAt(i).PixelData as byte[];
            byte[] pixelsnew = getNewByteArray(pixels, width, height);
            int stride = width / 2 * 3;

            BitmapSource bitmap = BitmapSource.Create(width / 2, height / 2, 96d, 96d, pf, null, pixelsnew, stride);

            StackPanel s = MainGrid.Children[i] as StackPanel;
            Image img = s.Children[0] as Image;

            //img.Source = bitmap;


            grabResultsList.ElementAt(i).Dispose();
            GC.Collect();
        }

CLICK HERE FOR IMAGE

Как видите, график ОЗУ постоянен.

Я использую GarbageCollector, но все же у меня есть эта проблема. Есть ли способ избавиться от объекта Image или что мне делать?

1 Ответ

0 голосов
/ 01 июля 2018

Вы должны заморозить BitmapSource перед тем, как назначить его свойству Source источника изображения:

bitmap.Freeze();
img.Source = bitmap;

Кроме того, вместо создания нового BitmapSource в каждом кадре, вы можете повторно использовать WriteableBitmap:

var pw = width / 2;
var ph = height / 2;
var bitmap = img.Source as WriteableBitmap;

if (bitmap == null || bitmap.PixelWidth != pw || bitmap.PixelHeight != ph)
{
    bitmap = new WriteableBitmap(pw, ph, 96, 96, pf, null);
    img.Source = bitmap;
}

bitmap.WritePixels(new Int32Rect(0, 0, pw, ph), pixelsnew, stride, 0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...