23

在我正在编写的 MATLAB 函数中,我正在生成一个图形。执行该功能时会显示该图形。我需要将图形保存为 JPEG 图像。为此,我可以在显示图形的图形窗口中执行文件->另存为。但我想自动化这个。我尝试使用 saveas() 函数来做到这一点。问题是生成的图像是不可取的。以下是演示问题的图像,向您展示我的意思:

使用 MATLAB 图窗窗口中的 File->Save As 手动保存的 JPEG 图像: 手动文件另存为jpg渲染

使用 saveas() 函数保存的 JPEG 图像(请注意,绘图不太好,并且标题重叠): 另存为 jpg 渲染

这是我生成图形并使用 saveas() 将图形保存为 JPEG 的 MATLAB 函数:

function JpgSaveIssueDemo( )
    figure( 1 );
    t = 0:0.1:8;    

    subplot( 2, 2, 1 );    
    plot( t, sin(t) );
    title( 'Plot 1 of Example to Demonstrate JPG Save Issue', 'FontSize', 18 );

    subplot( 2, 2, 2 );
    plot( t, sin(t) );
    title( 'Plot 2 of Example to Demonstrate JPG Save Issue', 'FontSize', 18 );

    subplot( 2, 2, 3 );
    plot( t, sin(t) );
    title( 'Plot 3 of Example to Demonstrate JPG Save Issue', 'FontSize', 18 );

    subplot( 2, 2, 4 );
    plot( t, sin(t) );
    title( 'Plot 4 of Example to Demonstrate JPG Save Issue', 'FontSize', 18 );

    saveas( gcf, 'DemoPlot', 'jpg' );
end

执行 JpgSaveIssueDemo() 时显示的图形未最大化。所以,我想如果我可以在执行 saveas()之前使用 JpgSaveIssueDemo() 中的函数调用/s 最大化它,那么保存的 JPEG 图像会很好。

所以,我在 JpgSaveIssueDemo() 的 saveas() 行之前使用了这段代码来最大化图形:

drawnow;
jFrame = get(handle(gcf),'JavaFrame'); 
jFrame.setMaximized(true);

然后,显示的图形被最大化。但是,结果是一样的:JPEG 图像仍然不理想地出现。

为此可以做些什么?

4

3 回答 3

20

Matlab 图形导出对话框和saveas()功能缺少很多理想的功能。特别是,savas()无法创建自定义结果图像,这就是您的结果看起来很差的原因。对于创建位图图像,我强烈建议使用第三方函数export_fig。通过将以下代码添加到您的函数(包括最大化技巧)

set(gcf, 'Color', 'white'); % white bckgr
export_fig( gcf, ...      % figure handle
    'Export_fig_demo',... % name of output file without extension
    '-painters', ...      % renderer
    '-jpg', ...           % file format
    '-r72' );             % resolution in dpi

我创建了这个图像:(在浏览器中使用“显示图像”或类似内容来获取原始大小)

使用 export_fig 创建的图像

要获得更高质量,请使用 150 甚至 300 dpi(用于打印)的更高分辨率。而不是最大化图形窗口,对于大多数应用程序来说,它适合定义轴大小以获得所需大小的图像:

unitSave = get(figureHandle, 'Unit');                % store original unit
set(figureHandle, 'Unit', 'centimeters');            % set unit to cm
set(figureHandle,'position',[0 0 width height]);     % set size
set(figureHandle, 'Unit', unitSave);                 % restore original unit
于 2013-04-13T09:03:15.090 回答
4

只需使用像 EPS 这样的无损可扩展格式,请参见下面代码段中的最后一行 :)

h1=figure % create figure
plot(t,Data,'r');
legend('Myfunction');

% Create title with required font size
title({'Variance vs distance'},'LineWidth',4,'FontSize',18,...
'FontName','Droid Sans');

% Create xlabel with required font size
xlabel({'Distance (cm)'},'FontSize',14,...
'FontName','DejaVu Sans');

% Create ylabel with required font size
ylabel({'Variance of sobel gradients'},'FontSize',14,...
'FontName','DejaVu Sans');

print(h1,'-depsc','autofocus.eps') % print figure to a file

虽然我无法在此处附加 EPS 文件,但不受支持,但它可扩展,可以放入文字处理器或 Latex 中,而不必担心分辨率不佳。

于 2014-11-21T09:27:38.443 回答
1

我有同样的问题,这是我用来解决它的:

set(gcf,'PaperPositionMode','auto') saveas(gcf,'file_to_save','png')

哪里gcf可以用手柄替换成想要的图形。

于 2016-11-21T22:51:59.480 回答