从 Helix Toolkit 保存图像
Saving an image from Helix Tookit
C#、WPF、Helix Toolkit. I am trying to save an image from a HelixViewport3D
viewport (as described here),但仍有问题。
预期方法: 将图像渲染到视口并使用 Viewport3DHelper.SaveBitmap()
或类似方法简单保存。
Viewport3DHelper.SaveBitmap(helixPlot.Viewport, @"E:\test.bmp", null, 4, BitmapExporter.OutputFormat.Png);
问题:它运行但捕获的图像是空白的。我最好的猜测是 Helix Toolkit 正在异步渲染(?)在我保存它时没有图像可供抓取。
可能的解决方法 1:渲染完成后响应事件。
问题:没有合适的事件可以订阅。
可能的解决方法 2: 添加在线延迟以允许图像在保存之前呈现。 (笨拙且不可靠,但将是朝着正确方向迈出的一步)。
Thread.Sleep(2000);
Viewport3DHelper.SaveBitmap(helixPlot.Viewport, @"E:\test.bmp", null, 4, BitmapExporter.OutputFormat.Png);
问题: 在我的代码执行完成之前,图像不会显示。如果我添加 10 秒的延迟,我只会得到额外 10 秒的空白屏幕。
可能的解决方法 3: 添加一个计时器以便渲染图像,然后我可以从计时器经过事件中保存图像。
System.Timers.Timer timer = new System.Timers.Timer();
...
timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
timer.Interval = 2000; // two seconds
timer.Start();
....
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
Viewport3DHelper.SaveBitmap(helixPlot.Viewport, @"E:\test.bmp", null, 4, BitmapExporter.OutputFormat.Png);
}
问题在于:虽然图像已成功渲染并且可以拍摄,但计时器 运行 在不同的线程中,我无法引用来自事件处理程序的 HelixPlot 控件。我得到:
System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it.'
可能的解决方法 4: 运行 UI 线程中的计时器使用 Timer.SynchronizingObject
问题所在:在 WPF 中似乎无法做到这一点 easily/simply。我可以做到 with a lot of additional code,目前这可能是我最好的选择,但由于冗长和缺乏稳健性,它似乎非常次优。
难道没有一些相当简单的方法来实现我想要做的事情吗?
问题的根源似乎是在调用方法完成执行之前图像不会渲染到视口。我真的不明白这是为什么。
编辑:我在另一个论坛上得知 Helix Toolkit 正在 WPF 复合渲染线程上渲染。然而,经过一些谷歌搜索后,我仍然none更清楚如何等待渲染完成。
我在这里得到了答案:
似乎没有可用的完成事件,所以我能找到的唯一解决方法是使用 async
.
C#、WPF、Helix Toolkit. I am trying to save an image from a HelixViewport3D
viewport (as described here),但仍有问题。
预期方法: 将图像渲染到视口并使用 Viewport3DHelper.SaveBitmap()
或类似方法简单保存。
Viewport3DHelper.SaveBitmap(helixPlot.Viewport, @"E:\test.bmp", null, 4, BitmapExporter.OutputFormat.Png);
问题:它运行但捕获的图像是空白的。我最好的猜测是 Helix Toolkit 正在异步渲染(?)在我保存它时没有图像可供抓取。
可能的解决方法 1:渲染完成后响应事件。
问题:没有合适的事件可以订阅。
可能的解决方法 2: 添加在线延迟以允许图像在保存之前呈现。 (笨拙且不可靠,但将是朝着正确方向迈出的一步)。
Thread.Sleep(2000);
Viewport3DHelper.SaveBitmap(helixPlot.Viewport, @"E:\test.bmp", null, 4, BitmapExporter.OutputFormat.Png);
问题: 在我的代码执行完成之前,图像不会显示。如果我添加 10 秒的延迟,我只会得到额外 10 秒的空白屏幕。
可能的解决方法 3: 添加一个计时器以便渲染图像,然后我可以从计时器经过事件中保存图像。
System.Timers.Timer timer = new System.Timers.Timer();
...
timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
timer.Interval = 2000; // two seconds
timer.Start();
....
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
Viewport3DHelper.SaveBitmap(helixPlot.Viewport, @"E:\test.bmp", null, 4, BitmapExporter.OutputFormat.Png);
}
问题在于:虽然图像已成功渲染并且可以拍摄,但计时器 运行 在不同的线程中,我无法引用来自事件处理程序的 HelixPlot 控件。我得到:
System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it.'
可能的解决方法 4: 运行 UI 线程中的计时器使用 Timer.SynchronizingObject
问题所在:在 WPF 中似乎无法做到这一点 easily/simply。我可以做到 with a lot of additional code,目前这可能是我最好的选择,但由于冗长和缺乏稳健性,它似乎非常次优。
难道没有一些相当简单的方法来实现我想要做的事情吗?
问题的根源似乎是在调用方法完成执行之前图像不会渲染到视口。我真的不明白这是为什么。
编辑:我在另一个论坛上得知 Helix Toolkit 正在 WPF 复合渲染线程上渲染。然而,经过一些谷歌搜索后,我仍然none更清楚如何等待渲染完成。
我在这里得到了答案:
似乎没有可用的完成事件,所以我能找到的唯一解决方法是使用 async
.