关于WPF中Image控件不释放内存的问题 80
我最初目的是想在wpf中播放带有透明通道的视频,但MediaElement控件不支持透明通道视频播放(依然是黑色背景),测试Image控件是能够播放带透明通道PNG图片的...
我最初目的是想在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有新值的时候应该释放掉前一个图片的显示内存,但实际并非如此。
以上问题求解 展开
程序已经写好,测试成功且效果不错,只是内存占用率让人无法接受。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有新值的时候应该释放掉前一个图片的显示内存,但实际并非如此。
以上问题求解 展开
4个回答
展开全部
由于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;
多张图片,自己做个循环吧!
先把图片缓存成二进制,这样可以释放对图片文件资源的占用,后面代码执行效率高;用通过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;
多张图片,自己做个循环吧!
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
大雅新科技有限公司
2024-11-19 广告
2024-11-19 广告
这方面更多更全面的信息其实可以找下大雅新。深圳市大雅新科技有限公司从事KVM延长器,DVI延长器,USB延长器,键盘鼠标延长器,双绞线视频传输器,VGA视频双绞线传输器,VGA延长器,VGA视频延长器,DVI KVM 切换器等,优质供应商,...
点击进入详情页
本回答由大雅新科技有限公司提供
2013-08-09
展开全部
我怀疑是电脑处理速度不够,在那么短时间内没能及时回收。
我刚才试了,10150张图片不卡,不阻塞。我得是台式i5,显卡也可以。
我刚才试了,10150张图片不卡,不阻塞。我得是台式i5,显卡也可以。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
XP系统回收比较慢,win7就好很多
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在结束后调用GC.Collect()试试
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询