快速刷新C#位图

时间:2015-10-30 15:29:28

标签: c# wpf

所以我正在尝试绘制叠加层。该覆盖图每40毫秒更新一次(这必须是高速)。似乎wpf没有绘制位图,所以我尝试将Bitmap转换为Bitmapsource。问题是转换几乎要复制它来转换它。位图不是线程安全的,然后在保存的过程中,它试图更新它并爆炸。锁似乎不想工作。

我的目标是创建一次叠加层,并重复使用它(清除它或其他东西)。有没有办法:

  1. 立即在WPF中显示System.Drawing.Bitmap。换句话说,将我的位图提供给某个WPF控件,就像图像一样,这样就可以绘制它。
  2. 将其转换为BitmapSource,而不保存到其他流或类似方法。
  3. 这是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或将位图保存为流等。

    非常感谢对此事的任何帮助或见解!

1 个答案:

答案 0 :(得分:1)

使用WriteableBitmap。它维护一个前后缓冲区,因此您可以在后缓冲区上写入,同时前缓冲区显示在Image元素中。当您完成后台缓冲区后,数据将被复制到前面。