【问题标题】:Saving an image from Helix Tookit从 Helix Toolkit 保存图像
【发布时间】:2020-08-18 21:03:06
【问题描述】:

C#、WPF、Helix Toolkit。我正在尝试从HelixViewport3D 视口保存图像(如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: 使用 Timer.SynchronizingObject 在 UI 线程中运行计时器

问题:在 WPF 中似乎无法轻松/简单地做到这一点。我可以做到with a lot of additional code,目前这可能是我最好的选择,但由于冗长和缺乏稳健性,它似乎非常不理想。

难道没有一些相当直接的方法可以实现我想要做的事情吗?

问题的根源似乎是在调用方法完成执行之前,图像没有渲染到视口。我真的不明白为什么会这样。

编辑:我在另一个论坛上被告知 Helix Toolkit 正在 WPF 复合渲染线程上渲染。然而,经过一些谷歌搜索后,我仍然不知道如何等待这个渲染完成。

【问题讨论】:

    标签: c# wpf helix-3d-toolkit


    【解决方案1】:

    我在这里得到了答案:

    Asynchronous operations within a loop - how to keep control of execution?

    似乎没有可用的完成事件,所以我能找到的唯一解决方法是使用async

    【讨论】:

    • 非常感谢,这为我节省了很多工作!我可以补充一点:我必须在Dispatcher.Invoke 函数中添加Threading.DispatcherPriority.Render 才能正确渲染Billboards。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 2021-01-01
    相关资源
    最近更新 更多