快速刷新C#位图

本文关键字:位图 刷新 | 更新日期: 2023-09-27 18:19:59

所以我正在尝试绘制一个覆盖图。该覆盖每40ms更新一次(这必须是高速的)。wpf似乎不绘制位图,所以我尝试将位图转换为位图源。这个问题是转换几乎必须复制它才能转换。位图不是线程安全的,然后在保存过程中,它试图更新它并爆炸。锁似乎不起作用。

我的目标是创建一次覆盖,然后重用它(清除它或其他什么)。有没有办法:

  1. 立即在WPF中显示System.Drawing.Bitmap。或者换句话说,把我的位图像图像一样交给一些WPF控件,这样它就会绘制它
  2. 将其转换为BitmapSource,而不保存到其他流或类似方法

这是C#库中的绘图方法。图像库似乎是wpf特定的,所以我不能马上使用WriteableBitmap。

        private void UpdateOverlay(List<DrawableShape> shapes, Bitmap bitmap)
    {
        using (var g = Graphics.FromImage(bitmap)) //explosion here( ui thread usually using it at this time).
        {
            //g.Clear(Color.Transparent);
            foreach (var shape in shapes)
            {
                switch (shape.Type)
                {
                    case ShapeType.Circle:
                        g.DrawEllipse(new Pen(shape.Color), shape.Dimensions);
                        break;
                    case ShapeType.CircleFilled:
                        g.FillEllipse(new SolidBrush(shape.Color), shape.Dimensions);
                        break;
                    case ShapeType.Square:
                        g.DrawRectangle(new Pen(shape.Color), shape.Dimensions);
                        break;
                    case ShapeType.SquareFilled:
                        g.FillRectangle(new SolidBrush(shape.Color), shape.Dimensions);
                        break;
                    default:
                        throw new ArgumentOutOfRangeException();
                }
            }
        }
    }

剩下的只是使用值转换器绑定到覆盖层,该值转换器调用CreateBitmapSourceFromHBitmap或将位图保存到流等。

对此事的任何帮助或见解都将不胜感激!

快速刷新C#位图

使用可写位图。它维护一个前缓冲区和后缓冲区,因此当前缓冲区显示在Image元素中时,您可以在后缓冲区上进行写入。当您处理完后缓冲区时,数据会被复制到前缓冲区。