Освобождение кеша WPF Image Control - PullRequest
2 голосов
/ 17 сентября 2011

У меня есть таймер, и на каждом тике я хочу взять файл изображения из памяти и изменить изображение, отображаемое в Image, с помощью этого куска кода

  Application.Current.Dispatcher.BeginInvoke(
            DispatcherPriority.Render,
            new Action(() =>
                           {
                               ms.Seek(0, SeekOrigin.Begin);
                               e.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);


                               BitmapImage bitmapImage = new BitmapImage();
                               bitmapImage.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
                               bitmapImage.BeginInit();
                               bitmapImage.StreamSource = ms;
                               bitmapImage.CacheOption = BitmapCacheOption.None;
                               bitmapImage.EndInit();

                               CameraImageBox.BeginInit();
                               CameraImageBox.Source = bitmapImage;
                               CameraImageBox.EndInit();
                               bitmapImage = null;
                               ms.Flush();
                           }));

Элемент управления изображением становится черным как смоль после нескольких десятков изображений, и весь пользовательский интерфейс становится совершенно не отвечающим. Использование памяти переходит к колоссальному 1 гигабайту, я предполагаю, что кэш визуализации элементов управления изображениями не освобождается, поскольку e.Image - это статический ресурс, который перерисовывается каждый раз.

Есть ли лучший способ сделать это, например, рендеринг изображения в Rectangle или освобождение кеша вручную?

1 Ответ

1 голос
/ 17 сентября 2011

Насколько я понимаю, вы добавляете изображение многократно к MemoryStream на каждой отдельной итерации.

это потому, что ваш объект ms существует извне и никогда не удаляется.Если я понимаю, что происходит правильно:

// go to begin of stream
ms.Seek(0, SeekOrigin.Begin);

// write your bitmap content into the stream 
e.Image.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);

...
...
...
// flush to write content to the stream
ms.Flush();

сейчас в теории я понимаю, что вы все время перезаписываете одни и те же байты, но почему бы вам не избавиться от MemoryStream с помощью блока using внутри вашего метода?и проверить результаты вместо того, чтобы открыть их как глобальную переменную?

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