WPF:如果位图经常更新,则呈现 WriteableBitmap 的最佳方法

标签 wpf bitmap

我目前正在通过在 WPF 中使用 WriteableBitmap 来实现宽带声纳显示。
宽带声纳“瀑布”显示从顶部开始,随着时间的推移,历史数据向下移动,第一行始终显示当前情况。

从技术上讲,我首先使用 WriteableBitmap.CopyPixels() 将位图的内容向下移动,然后更新数组以更新显示的当前行(顶部)。

我现在的问题是 - 在位图更新期间 - 屏幕闪烁。我尝试编写自己的 WritePixels 实现:

 public static unsafe void WritePixels(WriteableBitmap writeableBitmap, BitmapProperties bitmapProperties)
    {

       writeableBitmap.Lock();
       IntPtr buff = writeableBitmap.BackBuffer;

       byte* pbuff = (byte*)buff.ToPointer();

        for (int i = 0; i < bitmapProperties.BitmapArray.Length; i += bitmapProperties.BytesPerPixel)
        {
            pbuff[i] = bitmapProperties.BitmapArray[i];
            pbuff[i + 1] = bitmapProperties.BitmapArray[i + 1];
            pbuff[i + 2] = bitmapProperties.BitmapArray[i + 2];
            pbuff[i + 3] = bitmapProperties.BitmapArray[i + 3];

        }

        writeableBitmap.AddDirtyRect(new Int32Rect(0, 0, (int)writeableBitmap.Width, (int)writeableBitmap.Height));
        writeableBitmap.Unlock();

    }

不幸的是,ouctome 是一样的。

我在这里看到了一些类似的问题(实现医疗超声显示),但这里的用例略有不同,因为我不是从第三方 c++ 界面获取图片,而是我自己“绘制”并复制位图(更改/复制位图数组)。
渲染(位图的更新)应每 ~ 250 毫秒发生一次。

我在这里最好的选择是什么……使用缓存的位图?对于 WPF 中的低级位图操作(我使用的是 WPF 4.5),我没有太多经验。

谢谢。

编辑:我已经将它与一个用 C++/DirectX 编写的引用应用程序进行了比较:令我惊讶的是,我看到即使发生了“闪烁”。可能是一些光学效应,干扰眼睛等。然而,关于是否有比我目前的实现更好的方法,这个问题仍然有效。

最佳答案

您是否尝试过衡量刷新整个图像是否需要太长时间?也许双缓冲可以帮助你:

  • 复制整个位图
  • 在后台线程中添加您的更改或替换图像副本
  • 如果工作完成,从后台线程切换准备好的图像与当前可见的图像
  • 再次对当前不可见的图像进行更改等等...
  • 关于WPF:如果位图经常更新,则呈现 WriteableBitmap 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14424537/

    相关文章:

    android - 操作位图以获得最佳 ocr 检测

    XML中的Android位图图像大小

    c# - 清除文本框时属性的值不会更改

    c# - WPF UniformGrid 中单元格之间的边框

    android - 在android上调整位图大小的最有效内存方法?

    Android 位图缩放不正确

    c++ - 我应该使用什么 I/O 函数来写入 .bmp 文件?

    c# - 如何在WPF MVVM Catel应用程序中切换多个 View ?

    jquery - Silverlight 视频拉伸(stretch)

    c# - 如何在 WPF DataGrid 的列标题中设置垂直文本?