Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
快速刷新C#位图_C#_Wpf - Fatal编程技术网

快速刷新C#位图

快速刷新C#位图,c#,wpf,C#,Wpf,所以我试着画一个覆盖图。该覆盖每40毫秒更新一次(必须是高速)。wpf似乎不绘制位图,所以我尝试将位图转换为位图源。问题是转换几乎必须复制它才能转换。位图在保存过程中不是线程安全的,它试图更新和爆炸。锁似乎不想工作 我的目标是创建一次覆盖,并重用它(清除它或其他东西)。有没有办法: 直接在WPF中显示System.Drawing.Bitmap。或者换句话说,将我的位图交给像图像一样的WPF控件,这样它就可以绘制它了 将其转换为BitmapSource,而无需保存到其他流或类似方法 这是C#库中的

所以我试着画一个覆盖图。该覆盖每40毫秒更新一次(必须是高速)。wpf似乎不绘制位图,所以我尝试将位图转换为位图源。问题是转换几乎必须复制它才能转换。位图在保存过程中不是线程安全的,它试图更新和爆炸。锁似乎不想工作

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

  • 直接在WPF中显示System.Drawing.Bitmap。或者换句话说,将我的位图交给像图像一样的WPF控件,这样它就可以绘制它了
  • 将其转换为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();
                    }
                }
            }
        }
    
    private void UpdateOverlay(列表形状、位图)
    {
    在这里使用(var g=Graphics.FromImage(bitmap))//爆炸(此时ui线程通常使用它)。
    {
    //g、 透明(彩色、透明);
    foreach(形状中的变量形状)
    {
    开关(形状.类型)
    {
    大小写形状类型。圆:
    g、 抽屉(新钢笔(形状、颜色)、形状、尺寸);
    打破
    案例形状类型。圆圈填充:
    g、 FillEllipse(新的SolidBrush(形状.颜色),形状.尺寸);
    打破
    case ShapeType.Square:
    g、 DrawRectangle(新笔(形状.颜色),形状.尺寸);
    打破
    case ShapeType.SquareFilled:
    g、 FillRectangle(新的SolidBrush(形状.颜色),形状.尺寸);
    打破
    违约:
    抛出新ArgumentOutOfRangeException();
    }
    }
    }
    }
    
    其余的只是通过值转换器绑定到覆盖,该值转换器调用CreateBitmapSourceFromHBitmap或将位图保存到流等


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

    使用。它维护一个前后缓冲区,因此当前缓冲区显示在
    图像
    元素中时,您可以在后缓冲区上进行写入。使用后缓冲区后,数据将复制到前缓冲区。

    也许您可以将要显示的内容转换为
    .gif
    并显示出来?或者其他一些视频类型的东西。我遇到了这个问题,不知道你是否发现了它?这已经有一段时间了,但我想我最终使用了DrawingVisual类,它要快得多。ms docs链接:问题是我正在c#库中创建和绘制位图,在位图通过绑定到usercontrol之前,我无法访问该名称空间。