MATLAB新手:使用“saveas”将绘图保存为pdf文件时出错
Posted
技术标签:
【中文标题】MATLAB新手:使用“saveas”将绘图保存为pdf文件时出错【英文标题】:MATLAB newbie: error using "saveas" to save a plot as a pdf file 【发布时间】:2011-07-10 21:04:51 【问题描述】:我是 Mac (10.6.8) 用户。我已经编写了 MATLAB 代码来绘制计算结果,然后将绘图保存为 pdf。我使用“saveas”(参见下面的示例)。
我收到此错误:
??? Error using ==> print at 325
Problem converting PostScript. System returned error: -1.Failed to convert to output format; Ghostscript status: -100.**** Unable to open the initial device, quitting.
Error in ==> saveas at 155
print( h, name, ['-d' devi] )
Error in ==> Results_processor at 1219
saveas(gcf,saveFigTo1, 'pdf')
以下是相关代码:
calculationResultsPath = '/Me/Projects/ThisProject';
calculationResultsDirectory = strcat( calculationResultsPath,'MATLABProcessedResults' );
mkdir( calculationResultsDirectory );
% ...Code for importing results to be plotted from external files (works fine)...
% ...Code for plotting (works fine)... I get the figures I want.
% The problem is:
saveFigTo1 = strcat(resultsDirectory,'/majorsMgO.pdf')
saveas(gcf,saveFigTo1, 'pdf')
hold off
pause
clf;
一些进一步的信息......上周我第一次写它时效果很好!从那时起,我想我从 10.6.7 更新到 Mac OS 10.6.8,但我的代码或我使用的 Matlab 版本(R2009a)没有其他任何变化(除非我的记忆力很差!)。
另外,我遇到了一些关于类似问题的旧建议,以使用“打印”。我尝试使用:
打印(gcf,'文件名')。我确实得到了一个 pdf,但它不会在任何 pdf 查看程序中打开。我假设(但不确定)这可能与我使用 Mac 的事实有关。我注意到有一些东西(尤其是与外部文件操作相关的)不能在 Mac 上运行。
如果有人可以提供帮助,我将不胜感激。
更新: 我找到了一个适用于 Mac 的 GhostScript 并按照 Chris 的建议安装了它。不幸的是,那没有用。我在一个论坛上读到,目前许多 Mac 用户在使用 MATLAB 绘图时遇到问题,可能与 java 有关。上周有一个操作系统更新(到 OS X 10.6.8),这就是问题开始的时候。我的代码在那之前就可以工作了。
我仍然没有找到解决方案,我认为 MATLAB 人员也没有,所以如果有人对如何在不使用 saveas
的情况下保存绘图有建议,我很想听听他们的意见。 “打印”命令对我也不起作用——它会生成我无法打开的 PDF。
【问题讨论】:
【参考方案1】:我认为这里的问题是 GhostScript 死了,而不是 Matlab。针对该 GS 错误的 Google 出现了许多 pages,例如 this。这完全适用吗?如果您在 Matlab 之外使用 GS 是否有效?
顺便说一句,您可以看看这个 FEX 提交 export_fig。它对我很好。最坏的情况是您可以输出为 png 并稍后转换为 PDF。
【讨论】:
谢谢你,克里斯。在你提到它之前,我什至没有听说过 GhostScript。我会调查的!【参考方案2】:我可以提出的一个建议是使用 OS X 可以理解的不同格式,并通过系统调用将结果简单地转换为 pdf
看看以下是否有效:
% Load a test image
im = imread('cameraman.tif');
imshow(im); % display the image
saveas(gcf,'test.tif','tif');
% convert to pdf using a syscall to cupsfilter
!cupsfilter test.tif > test.pdf 2> /dev/null
% open the file with your default pdf viewer
!open test.pdf
如果上述方法不起作用,另一种方法是从图形窗口获取位图并使用imwrite
写入它。 注意,此方法无法从saveas
和print
的字体缩放功能中受益。这种方法假设上面的im
变量仍然存在。
imagesc(im); colormap gray;
% Set the border color to white
set(h,'Color',[1 1 1]);
% Get the image in the figure
frame = getframe(gcf);
imout = frame.cdata;
% on OS X, the stretch window image
% appears in the bottom right corner
% of the image. Remove it.
imout = imout(10:end-9,10:end-9,:);
% Write the image out to a lossless tif
imwrite(imout,'test.tif','tif','Compression','none')
然后您可以如上所述将 tif 转换为 pdf 文件。图的质量将取决于图的大小。在大多数情况下,我不会使用第二种方法,因为saveas
可以很好地处理字体。 使用 getframe 只是为了解决 saveas 的真正问题。
【讨论】:
非常感谢您的建议,ephsmith。 imshow(im) 命令生成图像,但文件“test.tif”和“test.pdf”都是空的。 很遗憾听到这个消息。我无法测试您的特定设置。我在 OS X 10.6.8 上运行 2010a。 感谢弗史密斯。直接保存确实有效,但是很痛苦,因为我需要保存这么多数字! 我完全明白。我还必须生成大量数字。 有趣的是,从图形窗口保存是有效的。在我的 Matlab 版本中,saveas
是从图形窗口保存的回调函数。我将发布另一种使用imwrite
的方法。以上是关于MATLAB新手:使用“saveas”将绘图保存为pdf文件时出错的主要内容,如果未能解决你的问题,请参考以下文章