如何使用 saveas() 将 MATLAB 图形保存为 JPEG 而图像不严重?
Posted
技术标签:
【中文标题】如何使用 saveas() 将 MATLAB 图形保存为 JPEG 而图像不严重?【英文标题】:How to save MATLAB figure as JPEG using saveas() without the image coming off badly? 【发布时间】:2013-04-05 18:20:21 【问题描述】:在我正在编写的 MATLAB 函数中,我正在生成一个图形。执行该功能时会显示该图形。我需要将图形保存为 JPEG 图像。为此,我可以在显示图形的图形窗口中执行文件->另存为。但我想自动化这个。我尝试使用 saveas() 函数来做到这一点。问题是生成的图像是不可取的。以下是演示问题的图像,向您展示我的意思:
在 MATLAB 图形窗口中使用 File->Save As 手动保存的 JPEG 图像:
使用 saveas() 函数保存的 JPEG 图像(请注意,绘图效果不佳且标题重叠):
这是我生成图形并使用 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() 时显示的图形未最大化。所以,我想如果我可以在 JpgSaveIssueDemo() before saveas() 执行之前使用函数调用/s 最大化它,那么保存的JPEG图像会很好。
所以,我在 JpgSaveIssueDemo() 中的 saveas() 行之前使用了这段代码来最大化图形:
drawnow;
jFrame = get(handle(gcf),'JavaFrame');
jFrame.setMaximized(true);
然后,显示的图形被最大化。但是,结果是一样的:JPEG 图像仍然无法正常显示。
为此可以做些什么?
【问题讨论】:
部分解决方案:Jpg 是错误的图像类型。图像中线条附近的垃圾方块是 jpg 压缩伪影。 jpg 用于照片之类的东西,png 用于图形之类的东西。 png 格式将为您提供更好的质量和更小的文件大小。 【参考方案1】: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
我创建了这张图片:(在浏览器中使用“显示图片”或类似内容来获取原始大小)
要获得更高质量,请使用 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
【讨论】:
感谢伟大的链接! 一个很好的答案,似乎也解决了我的问题:***.com/q/22764867/376454【参考方案2】:只需使用像 EPS 这样的无损可扩展格式,请参阅下面 sn-p 中的最后一行 :)
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 中,而不必担心分辨率不佳。
【讨论】:
【参考方案3】:我遇到了同样的问题,这是我用来解决的:
set(gcf,'PaperPositionMode','auto')
saveas(gcf,'file_to_save','png')
其中gcf
可以替换为所需图形的句柄。
【讨论】:
以上是关于如何使用 saveas() 将 MATLAB 图形保存为 JPEG 而图像不严重?的主要内容,如果未能解决你的问题,请参考以下文章
在 Matlab 中使用 hgexport 和 saveas 时出现无效句柄错误