当前位置: 首页 > 编程语言 > C#

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

时间:2023-04-11 03:13:32 C#

如何在不分配大量内存的情况下显示快速更新的图像?我在超声波机器上有一个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生成的源,这是一种访问位图源原始数据的hacky方式:请参阅此链接。我执行了CopyMemory的P/Invoke以将数据从Bitmap.Scan0复制到BitmapBuffer中。然后我使图像无效以更新屏幕,然后Dispose()Drawing.Bitmap对象释放内存。虽然这种方法已经奏效了一段时间,但它看起来很老套,而且我很难相信除了通过反射之外没有任何其他“正确”的方法可以做到这一点。问题:有没有更好的方法?这是我为WPFBitmapSource和GDI位图(用于我自己的项目)之间的别名(共享内存)编写的一些代码显然,您需要根据需要对其进行调整,并且它最终可能会变得不那么“hacky”结束一种感觉。类AliasedBitmapSource:BitmapSource{私有位图源;publicAliasedBitmapSource(Bitmapsource){this.source=source;this.pixelHeight=source.Height;this.pixelWidth=source.Width;this.dpiX=source.Horizo??ntalResolution;this.dpiY=source.VerticalResolution;}公共覆盖事件EventHandlerDownloadCompleted;公共覆盖事件EventHandlerDownloadFailed;公共覆盖事件EventHandlerDecodeFailed;protectedoverrideFreezableCreateInstanceCore(){thrownewNotImplementedException();}私有只读双dpiX;publicoverridedoubleDpiX{get{returndpiX;}}privatereadonlydoubledpiY;publicoverridedoubleDpiY{get{returndpiY;}}privatereadonlyintpixelHeight;publicoverrideintPixelHeight{get{返回pixelHeight;}}privatereadonlyintpixelWidth;publicoverrideintPixelWidth{get{返回pixelWidth;}}publicoverrideSystem.Windows.Media.PixelFormatFormat{get{返回PixelFormats.Bgra32;}}publicoverrideBitmapPalettePalette{get{returnnull;}}publicunsafeoverridevoidCopyPixels(Int32RectsourceRect,Arraypixels,intstride,intoffset){BitmapDatasourceData=source.LockBits(sourceRect.ToRectangle(),ImageLockMode.ReadWrite,System.Drawing.Imaging.PixelFormat.Format32bppArgb);fixed(byte*_ptr=&((byte[])pixels)[0]){byte*dstptr=_ptr;byte*srcptr=(byte*)sourceData.Scan0;for(inti=0;i*"write"我的意思是"10分钟内走到一起"如果你用最新的WPF位检查WriteableBitmap,你将不得不做更多的跑腿工作,但你真的会做一个快速的谷歌更新,你会得到一些示例以上是C#学习教程:如何在不分配大量内存的情况下显示快速更新的图像?分享完整内容如果对大家有用,需要了解更多C#学习教程,希望大家多多关注toit-本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除,如需转载请注明出处: