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