gpt4 book ai didi

c# - 从 Helix Toolkit 保存图像

转载 作者:行者123 更新时间:2023-12-04 04:01:28 27 4
gpt4 key购买 nike

C#,WPF,Helix Toolkit .我正在尝试从 HelixViewport3D 视口(viewport)(如 here 所述)保存图像,但仍有问题。

预期方法:将图像渲染到视口(viewport)并使用 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目前这可能是我可用的最佳选择,但由于冗长和缺乏稳健性,它似乎非常次优。

是否没有一些合理直接的方法来实现我想要做的事情?

问题的根源似乎是在调用方法完成执行之前图像不会呈现到视口(viewport)。我真的不明白这是为什么。

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

最佳答案

我在这里得到了答案:

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

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

关于c# - 从 Helix Toolkit 保存图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63008755/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com