2

我在 matlab 中编写了一个相当大的数据采集程序,它以非常紧凑的时间安排接收输入数据,并在 GUI 上实时绘制它。我的问题是我需要一种方法让程序的用户通过网络查看 GUI 以远程监控他们的数据。我的解决方案是每 5 秒左右拍摄一次 GUI 图的快照,并将该图像托管在 Web 服务器上。

然而,这会导致两个不可接受的问题:

  1. 打印功能太慢了——每次保存大约需要 3-4 秒,并且在每次调用“打印”后程序随后在其他例程中落后。

  2. 由于某种原因,打印功能会导致 GUI 暂时变形,从而更改某些组件的位置并复制其他组件。它只持续一秒钟左右,但它仍然使我的解决方案不切实际。

有没有办法解决这些问题中的任何一个?

编辑:* **对于任何感兴趣的人,我发现的最佳解决方案是使用名为Minicap 的外部工具包。

4

5 回答 5

8

文件格式有很大的不同。这是一个示例散点图

n = 1e4;
hfig = figure;
hax = plot(1:n, rand(1, n), '+');

...以及保存为不同格式的一些时间。

tic; print(hfig, 'test.bmp', '-dbmp'); toc      %4.1s
tic; print(hfig, 'test.bmp', '-dbmp256'); toc   %2.0s
tic; print(hfig, 'test.png', '-dpng'); toc      %1.9s
tic; print(hfig, 'test.tiff', '-dtiff'); toc    %0.45s
tic; print(hfig, 'test.jpg', '-djpeg'); toc     %0.44s
tic; print(hfig, 'test.wmf', '-dmeta'); toc     %0.42s

tiffjpeg并且wmf首先是联合的,虽然 tiff 文件很大,但 jpeg 质量很差,如果您不在 Windows 平台上,wmf 会出现问题。


对于光栅格式,分辨率也会影响时间。

tic; print(hfig, 'test600.png', '-dpng', '-r600'); toc   %4.2s
tic; print(hfig, 'test72.png', '-dpng', '-r72'); toc     %0.31s

加快打印速度的另一件事是删除不需要的绘图部分。透明度是计算密集型的,图例也是如此。对数据进行采样而不是全部绘制也可以节省时间。

于 2011-07-25T15:46:47.740 回答
3

对于任何在未来遇到这个问题的人来说,我为 Windows 平台登陆的解决方案是一个名为Minicap的小程序,它允许人们使用系统命令轻松捕获和保存屏幕截图。

需要有该图的底层 Windows 句柄,可以使用gethwnd()由超级用户 Yair M. Altman 编写的公开可用的 matlab 函数访问该句柄。

然后,您可以对图形进行非常快速、高分辨率的屏幕截图,并将其保存到磁盘,如下所示:

winHandle = gethwnd(matlabFigHandle);
cmndstr = sprintf('%s','MiniCap.exe -save ','"',snapShotFileNamePath,'"',...
    ' -compress 9', ' -capturehwnd ', num2str(winHandle),' -exit');
system(cmndstr);
于 2012-11-21T20:51:33.537 回答
2

您的解决方案必须是纯 Matlab 吗?使用平台工具包拍摄保存 GUI 的窗口的快照,并将其写入磁盘。这是非常快的,因为它将在一个单独的线程中处理你的线程问题。

于 2011-07-25T16:00:41.303 回答
1

您可能不应该一直捕获,而应仅在实际通过 Web 发出请求时捕获。即使这样,也不要为每个请求捕获,但仅当最后一个快照超过 5 秒时才捕获。这应该对提高性能大有帮助。

于 2011-07-25T15:07:36.590 回答
1

您可以将saveas()您的图形作为.fig文件(应该相当快)与 MATLAB 实例一起进行计算,然后使用不同的 MATLAB 实例(可能在不同的计算机上)将print其转换为所需的格式。这样您就可以避免其他例程的延迟,并且由 print 引起的失真不会发生在您的“主”MATLAB 实例上。

请注意,这print是一个 .m 文件,您可以查看它以查看是否有任何内容可以针对您的特定情况丢弃。例如,它调用private/prepare.m我认为会导致您谈论的扭曲/位置变化......也许您可以玩这个?

更新:数据是否必须通过网络界面?如果用户群足够小,也许您可​​以尝试教他们使用远程桌面软件,例如 VNC、Teamviewer 或 Windows 内置的终端服务器来远程查看他们的数据?

于 2011-07-25T15:12:46.267 回答