我在处理图像并一个接一个地显示出来,使用BitmapImage作为xaml图像对象的图像源。问题是GC不停地工作,原因是BitmapImage.StreamSource可能没有被释放(根据其他链接-例如https://social.msdn.microsoft.com/Forums/windowsdesktop/en-US/46bab672-c65c-4194-96ba-03f3cfc32fa4/bitmapimagestreamsource-decodepixelwidth-amp-memory-consumption?forum=windowswic)。此外,通过使用StreamSource而不是UriSource,似乎函数DecodePixelWidth不起作用。有什么建议吗?在没有GC压力的情况下显示图像的最佳方法是什么?
我做以下事情:获取处理后的图像数据的byte[],并使用转换器- ByteArrayToBitmapImageConverter:public object Convert(object value,Type targetType,object parameter,CultureInfo culture){ byte[]?imageByteArray = value as byte[];if(i == null)return null!;var img =新位图图像();
using (Stream stream = new MemoryStream(imageByteArray))
{
img.BeginInit();
img.StreamSource = stream;
img.DecodePixelWidth = 640;
img.CacheOption = BitmapCacheOption.OnLoad;
img.EndInit();
}
return img;
}
byte[]本身在调用函数中被释放(实际上我使用的是ArrayPool,但似乎是img.StreamSource导致了这个问题
1条答案
按热度按时间kgsdhlau1#
我发现了一个解决方案,我仍然需要采用我的需要,但似乎工作。我看了VlcVideoSourceProvider + VlcControl的代码,它使用它和使用相同的逻辑。基本上它所做的是创建一个MemoryMappedFile和视图,并附加ImageSource到文件部分。这个ImageSource连接(依赖属性)到具有图像对象的VlcControl。它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的
看起来工作正常。