我有一个计时器,每次打勾我想从内存中取一个图像文件,用这段代码更改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();
}));
图像控件在几十张图像后变成黑色,整个ui变得反应迟钝。内存使用量跃升到1gig,我假设图像控件渲染缓存没有被释放,因为e.Image
是一个每次重绘的静态资源。
有没有更好的方法来执行此操作,例如在Rectangle
中呈现图像或手动释放缓存?
答案 0 :(得分:1)
我的理解是,您在每次迭代时多次将图像添加到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();
现在理论上我理解你一直在覆盖相同的字节,但是为什么不在你的方法中使用using块来处理MemoryStream
并测试结果而不是让它作为全局打开变量?