WPF,使用BitmapImage作为显示的图像源-创建GC压力

roqulrg3  于 2023-04-13  发布在  其他
关注(0)|答案(1)|浏览(170)

我在处理图像并一个接一个地显示出来,使用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导致了这个问题

kgsdhlau

kgsdhlau1#

我发现了一个解决方案,我仍然需要采用我的需要,但似乎工作。我看了VlcVideoSourceProvider + VlcControl的代码,它使用它和使用相同的逻辑。基本上它所做的是创建一个MemoryMappedFile和视图,并附加ImageSource到文件部分。这个ImageSource连接(依赖属性)到具有图像对象的VlcControl。它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的图形文件,它是一个简单的

_inpMemoryMappedFile = MemoryMappedFile.CreateNew(null, size);
    var handle = _inpMemoryMappedFile.SafeMemoryMappedFileHandle.DangerousGetHandle();

    this.dispatcher.Invoke((Action)(() =>
    {
        this.VideoSource = (InteropBitmap)Imaging.CreateBitmapSourceFromMemorySection(handle,
            (int)Width, (int) Height, pixelFormat, Pitch, 0);
    }));

    _inpMemoryMappedView = _inpMemoryMappedFile.CreateViewAccessor();
    var viewHandle = _inpMemoryMappedView.SafeMemoryMappedViewHandle.DangerousGetHandle();

看起来工作正常。

相关问题