C#,WPF,螺旋工具包。我试图从HelixViewport3D视图(如描述的这里)中保存图像,但仍然存在问题。
预期的方法:将图像呈现到视图中,并使用Viewport3DHelper.SaveBitmap()或类似方法保存。
Viewport3DHelper.SaveBitmap(helixPlot.Viewport, @"E:\test.bmp", null, 4, BitmapExporter.OutputFormat.Png);的问题是:它运行,但是捕获的图像是空白的。我最好的猜测是,Helix是异步呈现的(?)在我保存它的时候,没有图像可以抓取。
可能的解决方法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中轻松/简单地做到这一点。我可以这样做,有很多额外的代码,目前这可能是我最好的可用选项,但由于冗长和缺乏健壮性的原因,这似乎是次优。
难道没有一些相当直截了当的方法来实现我正在努力做的事情吗?
问题的根源似乎是,在调用方法完成执行之前,图像不会呈现到viewport。我真的不明白这是为什么。
编辑:我在另一个论坛上被告知,Helix正在WPF复合呈现线程上呈现。然而,在谷歌上搜索了一段时间之后,我仍然不知道如何等待这个渲染完成。
发布于 2020-08-18 13:03:06
https://stackoverflow.com/questions/63008755
复制相似问题