关于WPF中Image控件不释放内存的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于WPF中Image控件不释放内存的问题相关的知识,希望对你有一定的参考价值。

我最初目的是想在wpf中播放带有透明通道的视频,但MediaElement控件不支持透明通道视频播放(依然是黑色背景),测试Image控件是能够播放带透明通道PNG图片的,故采用image控件不停加载PNG序列帧图片的方式来实现播放透明背景的视频。
程序已经写好,测试成功且效果不错,只是内存占用率让人无法接受。400张序列帧图片,所有图片加起来总大小170M,程序运行以后内存使用超过2G!实现方法是先把图存放在一个BitmapImage对象数组中,然后依次给image的.Source赋值。关键代码如下:(使用语言无所谓,C# or vb.net)
dim bmp() As BitmapImage
dim ImageRQ As New Image
dim img As ImageSource
(1)把图片弄到内存里
ReDim bmp(PngMaxName - PngMinName + 1)
For i = PngMinName To PngMaxName
bmp(i) = New BitmapImage(New Uri(PngPath + QM + Trim(Str(i)) + ".jpg", UriKind.RelativeOrAbsolute))
Next i
经过测试以后保存图片部分并不占用更多的内存,占用的只是原图片大小的内存。
(2)用image依次显示这些图
Private Sub Timer1_Tick() Handles Timer1.Tick 时钟频率每秒播30张图
aaa= aaa + 1
img = (bmp(aaa))
ImageRQ.Source = img
End Sub
经测试
ImageRQ.Source = img一句没有加之前内存均正常。只要一显示,随着播放过程的推移内存使用率逐渐增大,直到内存使用率98%
疑点:只有一个image对象,当 ImageRQ.Source = img有新值的时候应该释放掉前一个图片的显示内存,但实际并非如此。

以上问题求解

参考技术A 由于Image.Source切换BitmapImage后,仍然抓着旧的bmImg不放,导致内存溢出.再多的内存也不够用.
先把图片缓存成二进制,这样可以释放对图片文件资源的占用,后面代码执行效率高;用通过MemoryStream生成的Source,用完就被释放了。
参考以下代码:

byte[] FacePicture = BitmapImageToByteArray(img)//图片转成数组的方法网上有很多,自己找下吧。
ImageSourceConverter imageSourceConverter = new ImageSourceConverter();

MemoryStream stream = new MemoryStream(FacePicture);
BitmapFrame source = imageSourceConverter.ConvertFrom(stream) as BitmapFrame;
bitmap.Dispose();
ImageRQ.Source = source;
多张图片,自己做个循环吧!
参考技术B 我怀疑是电脑处理速度不够,在那么短时间内没能及时回收。
我刚才试了,10150张图片不卡,不阻塞。我得是台式i5,显卡也可以。
参考技术C XP系统回收比较慢,win7就好很多 参考技术D 在结束后调用GC.Collect()试试

wpf从数据库读取图片显示到image控件上去问题????????????????

byte[] img = mod.GeneratelicenseUrl.ToArray();//这里img都有数值了
MemoryStream mestream = new MemoryStream(img);
BitmapImage image = new BitmapImage();
image.BeginInit();//执行到此就报错 显示(未找到适用于完成此操作的图像处理组)件。
image.StreamSource = mestream;
image.EndInit();
aqxk.Source = image;
aqxk.Height = image.Height;
aqxk.Width = image.Width;

在线等 急急急急急

参考技术A silverlight中:
BitmapImage image = new BitmapImage();
image.SetSource(new MemoryStream(img));
aqxk.Source =image
wpf中你测试一下看看.追问

wpf中没有SetSource方法 点不出来

以上是关于关于WPF中Image控件不释放内存的问题的主要内容,如果未能解决你的问题,请参考以下文章

VB释放webbrowser

请教关于QT中内存释放的问题

WPF WebBrowser Memory Leak 问题及临时解决方法

vb 释放Webbrowser控件

关于结构体中内存的释放问题

从文件中打开图像,然后释放锁定?