首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Helix Tookit保存图像

从Helix Tookit保存图像
EN

Stack Overflow用户
提问于 2020-07-21 06:39:09
回答 1查看 478关注 0票数 3

C#,WPF,螺旋工具包。我试图从HelixViewport3D视图(如描述的这里)中保存图像,但仍然存在问题。

预期的方法:将图像呈现到视图中,并使用Viewport3DHelper.SaveBitmap()或类似方法保存。

代码语言:javascript
复制
Viewport3DHelper.SaveBitmap(helixPlot.Viewport, @"E:\test.bmp", null, 4, BitmapExporter.OutputFormat.Png);

的问题是:它运行,但是捕获的图像是空白的。我最好的猜测是,Helix是异步呈现的(?)在我保存它的时候,没有图像可以抓取。

可能的解决方法1:一旦呈现完成,就会对事件做出响应。

的问题在于:没有合适的事件可订阅。

可能的解决方法2:添加一个内联延迟以允许图像在保存之前呈现。(笨重而不可靠,但这是朝正确方向迈出的一步)。

代码语言:javascript
复制
Thread.Sleep(2000);
Viewport3DHelper.SaveBitmap(helixPlot.Viewport, @"E:\test.bmp", null, 4, BitmapExporter.OutputFormat.Png);

的问题在于:在我的代码执行完成之前,图像是不会显示的。如果我加了10秒的延迟,我只会得到一个空屏幕10秒。

可能的解决方法3:添加了一个计时器,以便呈现图像,然后我可以从计时器经过事件中保存图像。

代码语言:javascript
复制
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控件。我得到:

代码语言:javascript
复制
System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it.'

可能的解决方法4:使用Timer.SynchronizingObject在UI线程中运行计时器

的问题在于:似乎不可能在WPF中轻松/简单地做到这一点。我可以这样做,有很多额外的代码,目前这可能是我最好的可用选项,但由于冗长和缺乏健壮性的原因,这似乎是次优。

难道没有一些相当直截了当的方法来实现我正在努力做的事情吗?

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

编辑:我在另一个论坛上被告知,Helix正在WPF复合呈现线程上呈现。然而,在谷歌上搜索了一段时间之后,我仍然不知道如何等待这个渲染完成。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-18 13:03:06

我在这里得到了一个答案:

循环中的异步操作-如何保持对执行的控制?

似乎没有可用的完成事件,所以我找到的唯一绕过它的方法就是使用async

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63008755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档