【问题标题】:MATLAB: Print contents of uipanel to PNG imageMATLAB:将 uipanel 的内容打印到 PNG 图像
【发布时间】:2013-04-02 15:50:47
【问题描述】:

我不知道如何在 MATLAB 中完成以下操作。我有一个看起来像这样的图:


在图中,我有一个包含许多子图的面板和一个允许我查看面板的一部分的滚动条。

我想将面板的 整个 内容保存到 PNG 图像文件(不仅仅是可见部分),即我想要一个高矩形文件,而不是需要滚动。

生成图形的代码如下:

function draw(obj)
       figure;
       panel1 = uipanel('Parent',1);
       panel2 = uipanel('Parent',panel1);
       panelheight = obj.nIterations / 2;
       set(panel1,'Position',[0 0 0.97 1]);
       set(panel2,'Position',[0 1-panelheight 1 panelheight]); %%
       nPlot = 1;
       for i=1:obj.nIterations
            models = obj.iterations{i};
            for nModel=1:length(models)
                subplot(obj.nIterations,length(models)*2,nPlot);
                nPlot = nPlot + 1;
                drawTransitions(models{nModel});
                set(gca,'Parent',panel2);
                subplot(obj.nIterations,length(models)*2,nPlot);
                nPlot = nPlot + 1;
                drawRewards(models{nModel});
                set(gca,'Parent',panel2);
            end
       end
       s = uicontrol('Style','Slider','Parent',1,...
        'Units','normalized','Position',[0.97 0 0.03 1],...
        'Value',1,'Callback',{@slider_callback1,panel2,panelheight});
end

我尝试了以下方法,但没有成功。

  1. saveas 功能可以保存整个图形,而不仅仅是面板。此外,它还会剪裁面板的不可见部分。
  2. export_fig(panel2.'file.png') 只提供纯灰色图像。

【问题讨论】:

  • 这是个好问题。我也尝试做类似的事情,但不得不以getframe 解决,但这仅适用于打印屏幕并且会截断图像。
  • f=figure 怎么样; print(f,'-djpeg','file.jpg'); ?我不确定。
  • @MinLin,谢谢,但您的解决方案会截断图像,而我希望文件包含屏幕上不可见的位
  • 如果您可以发布代码的最小工作示例,这将有所帮助,以便其他人可以尝试直接在 Matlab 中解决您的问题。

标签: matlab matlab-figure


【解决方案1】:

您为什么不直接滚动面板并抓取框架并将它们连接在一起?这是一些基本上可以做到这一点的代码。我会发布图片,但我想我没有足够的积分。您可能需要调整滚动,并可能使滑块不可见,但它可以工作。

function printPanel(pnl,filename)




fig  = figure(ancestor(pnl,'figure'));

pnl_units = get(pnl,'units');
fig_units = get(fig,'units');

set(pnl,'units','pixels')
set(fig,'units','pixels')

pnl_rect = getpixelposition(pnl);
fig_rect = getpixelposition(fig);

pnl_height = pnl_rect(4);
fig_height = fig_rect(4);

pnl_rect(2) = -pnl_height;
set(pnl,'position',pnl_rect)


N = ceil(pnl_height/fig_height);

CDATA = cell(N,1);

for i = 1:N
    F = getframe(fig);
    CDATA{i} = F.cdata;
    pnl_rect(2) = pnl_rect(2)+fig_height;
    set(pnl,'position',pnl_rect)
    drawnow
end


set(pnl,'units',pnl_units)
set(fig,'units',fig_units)

imwrite(cat(1,CDATA{:}),filename)
end

【讨论】:

    【解决方案2】:
    • 您可以去掉 ui 元素,只用所有子图制作一个图形,然后导出该图形,例如使用print -dpng ....

    • saveas 将句柄作为第一个参数。也许这不一定是图形或模型句柄,但可以是对面板内容的引用。

    【讨论】:

      猜你喜欢
      • 2013-04-25
      • 1970-01-01
      • 2018-06-20
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多