gpt4 book ai didi

c# - 如何在不分配大量内存的情况下显示快速更新的图像?

转载 作者:可可西里 更新时间:2023-11-01 08:19:56 33 4
gpt4 key购买 nike

我在超声机上安装了一个 WPF 应用程序,它以每秒 30 帧以上的速度显示用 C++ 生成的超声图像。

据我了解,在 WPF 中显示图像的正常过程是为您的图像创建一个 BitmapSource 并为您的图像设置 Source,然后使其失效并显示。

由于 BitmapSources 没有实现 IDisposable,使用这种方法迫使我每秒创建 30 个 BitmapSources。对于 32bppArgb 格式的 640x480 图像,每秒分配大约 30MB/秒的内存,然后每 10 秒处理一次垃圾,导致明显的延迟。显然不是可接受的解决方案。

我目前的解决方案是:

在 C++ 中: 我在托管 C++ 中创建一个 System.Drawing.Bitmap(WinForms 位图),从指针执行 memcpy 以填充图片,使用 Graphics 对象做一些额外的绘图我需要,并在 ImageReceived 事件期间将其传递到 C#/WPF。

在 C# 中 Image.Source 设置为由 BitmapBuffer 生成的源,这是一种访问位图源原始数据的 hack 方式:参见 this link.我执行 CopyMemory 的 P/Invoke 以将数据从 Bitmap.Scan0 复制到 BitmapBuffer 中。然后我使 Image 无效以更新屏幕,并 Dispose() Drawing.Bitmap 对象以释放内存。

虽然这种方法已经奏效了一段时间,但它看起来很老套,我很难相信除了通过反射(reflection)之外没有其他“合适”的方法来做到这一点。

问题:有没有更好的办法?

最佳答案

如果您使用的是最新的 WPF 位,请查看 WriteableBitmap ,你将不得不做更多的腿部工作,但你会真正快速更新。

快速谷歌一下,您会得到一些示例。

关于c# - 如何在不分配大量内存的情况下显示快速更新的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/812288/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com