MATLAB: Print contents of uipanel to PNG image

笑着哭i 提交于 2019-12-23 01:13:46

问题


I don't know how to accomplish the following in MATLAB. I have a figure which looks like this:


In the figure, I have a panel with many subplots and a scrollbar that allows me to view a portion of the panel.

I want to save the whole contents of the panel to a PNG image file (not just the visible portion), i.e. I want to have a file which is a tall rectangle, and doesn't require scrolling.

The code for generating the figure is as follows:

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

I have tried the following, without success.

  1. The saveas funstion saves the whole figure, not just the panel. Also, it clips the invisible portion of the panel.
  2. export_fig(panel2.'file.png') gives just a solid gray image.

回答1:


Why don't you just scroll your panel and grab the frames and concatenate them all together? Here's some code that will basically do that. I would have posted am image, but I guess I don't have enough points for that. You may need to fiddle with the scrolling, and maybe making the slider invisible, but it works.

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:


  • You could get rid of the ui elements and just make a figure with all the subplots, and then export that one, using e.g. print -dpng ....

  • saveas takes a handle as a first argument. Maybe this does not have to be a figure or model handle, but could be a reference to the contents of the panel.



来源:https://stackoverflow.com/questions/15768545/matlab-print-contents-of-uipanel-to-png-image

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!