【问题标题】:How to speed up matlab's 'print' function如何加快matlab的“打印”功能
【发布时间】:2011-10-12 16:08:03
【问题描述】:

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

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

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

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

有没有办法解决这些问题?

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

【问题讨论】:

  • 您是否尝试过将图形(PRINT)导出为非压缩格式(可能是 BMP),也许这样会更快?比较 PRINT 与 GETFRAME 解决方案的性能也可能很有趣..
  • 保存到 png 比保存到 bmp 花费的时间更少。写入文件比压缩​​阶段花费的时间更长。
  • @RichieCotton:这个想法是尝试不同的图像格式,看起来你已经建议了:)
  • 您好 Jerad,请随时添加您自己的解决方案作为实际答案并接受它,以表明问题已为您解决。如果您添加到 Minicap 的链接,人们会喜欢您的 ;-)。
  • @Jonas:好的,很高兴知道。谢谢!

标签: user-interface matlab printing save figure


【解决方案1】:

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

【讨论】:

  • 但正如我所说,调用打印函数会导致其他程序例程(即数据采集函数)延迟——我无法承受这种情况发生。
  • 在这里抓住稻草 :) 您可以运行两个 matlab 实例,一个用于捕获,它每 5 秒在两个磁盘上丢弃原始数据,另一个用于渲染 UI 快照。哎呀,刚刚阅读下面的最新消息......已经建议!祝你好运。
【解决方案2】:

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

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

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

【讨论】:

  • 程序被编译成一个独立的可执行文件,用户可以使用 matlab MCR 运行,所以我不认为 MCR 允许多个实例,但我可能错了。我会调查的。谢谢
【解决方案3】:

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

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

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


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

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

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

【讨论】:

  • 由于 OP 正在开发 GUI,也许您应该在图中包含一些 uicontrols 并重复计时。您也可以添加imwrite(frame2im(getframce(gcf)),'file.ext') 作为另一种选择...
【解决方案4】:

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

【讨论】:

  • Matlab 内嵌了 JVM,Matlab 图形 GUI 通常在 Swing 中实现。您可以获取图形的 Java AWT 对等对象并使用 java.awt.Graphics 调用获取窗口快照,它仍然是可移植的 Matlab。
【解决方案5】:

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

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

然后您可以快速、高分辨率地截取图形并将其保存到磁盘,如下所示:

winHandle = gethwnd(matlabFigHandle);
cmndstr = sprintf('%s','MiniCap.exe -save ','"',snapShotFileNamePath,'"',...
    ' -compress 9', ' -capturehwnd ', num2str(winHandle),' -exit');
system(cmndstr);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 2021-12-05
    相关资源
    最近更新 更多