这是printing 中的documented limitation 在无头模式下:
不带显示器的打印和导出
在 UNIX 平台(包括 Macintosh)上,您可以从
MATLABnodisplay模式(matlab -nodisplay),可以使用打印
您可以将大多数驱动程序与显示器一起使用并导出到大多数
相同的文件格式。所有 PostScript 和 Ghostscript 设备
在 UNIX 平台上以 nodisplay 模式运行。图形设备
-djpeg、-dpng、-dtiff(压缩 TIFF 位图)和 -tiff
(带有 TIFF 预览的 EPS)也可以,但 在nodisplay 下他们使用
Ghostscript 生成输出,而不是使用内置的驱动程序
MATLAB。但是,Ghostscript 在生成时会忽略 -r 选项
-djpeg、-dpng、-dtiff 和 -tiff 图像文件。这意味着
运行时不能改变图像文件的分辨率
nodisplay 模式.
-noFigureWindows 启动选项也是如此
压制所有平台上的数字。在 Windows 平台上 -dwin,
-dwinc 和 -dsetup 选项在以下情况下照常运行
-noFigureWindows。但是,printpreview GUI 不起作用
在这种模式下。自然,Windows 只输出-dwin 和-dwinc
格式不能在 UNIX 或 Mac 平台上使用,无论是否有
显示。
分辨率注意事项
使用-rnumber 指定生成输出的分辨率。在
一般来说,使用更高的值会产生更高质量的输出,但在
较大输出文件的成本。影响分辨率和输出
所有 MATLAB 内置栅格格式的大小(在
Graphics Format Files 中表格的第四列)。
注意: 内置图形格式直接从 MATLAB 生成,无需通过 Ghostscript 库进行转换。此外,在无头
(nodisplay) 模式,写入某些图像格式不是由
内置驱动程序,就像使用显示器时一样。这些格式
是-djpeg、-dtiff 和-dpng。此外,-dhdf 和
-dbmp 格式不能在无头模式下生成(但你可以
用-dbmp16m 替换-dbmp)。请参阅“打印和导出
不使用显示器时打印的详细信息。
与内置的 MATLAB 格式不同,图形输出通过
Ghostscript 不直接服从-r 选项设置。然而
由 MATLAB 生成的中间 PostScript 文件作为
Ghostscript 处理器受-r 设置的影响,因此可以
间接影响最终生成的 Ghostscript 的质量
输出。
-r 选项对输出质量的影响可能很微妙
使用 OpenGL 或 ZBuffer 渲染器和
写入 MATLAB 内置光栅格式之一,或者当
生成包含嵌入式光栅图像的矢量输出(对于
例如,PostScript 或 PDF)。指定更高的效果
以更高的分辨率查看输出时,分辨率更明显
放大或打印时,因为较大的-r 设置提供
缩放图像时要使用的更多数据。
当生成完全矢量化的输出时(如使用 Painters 时)
渲染器以输出矢量格式,例如 PostScript 或 PDF),
分辨率设置影响输出的细节程度;环境
更高的分辨率产生更清晰的输出(但在
分辨率可能没有明显的影响)。例如,间隙宽度
不使用实线 ('-') 线条样式的线条可能会受到影响。
parfor 生成无头 MATLAB 实例(Windows 和 Unix),因此根据上述情况,工作进程将回退到忽略 -r 选项的 Ghostscript 打印驱动程序。
当您将图形导出为光栅图形格式(PNG、JPEG、TIFF 等)时,有两种情况:
如果您在正常会话中打印,MATLAB 将使用其内置驱动程序直接生成图形文件,并且应遵循您指定的分辨率
-
另一方面,如果您在无头模式下打印,MATLAB 将在内部以 Postscript 矢量格式导出图形,然后使用 Ghostscript 使用以下 Ghostscript 选项将其转换为请求的光栅格式:
-dNOPAUSE -q
-I"C:\Program Files\MATLAB\R2014a\sys\extern\win64\ghostscript\ps_files"
-I"C:\Program Files\MATLAB\R2014a\sys\extern\win64\ghostscript\fonts"
-sDEVICE=jpeg
-g576x432
-sOutputFile="file.jpeg"
如您所见,由于某种原因,MATLAB 在将 PS 文件转换为其他格式时,在无头模式下使用固定的目标大小 576x432。
这是一些用于快速实验的代码。我已经在本地并行池上对其进行了测试;所有光栅格式(PNG、JPEG、TIFF、PPM)的固定大小为 576x432(如前所述,-r 选项被忽略)。 PDF 也是通过将 PS 文件转换为 PDF 生成的(使用-sDEVICE=pdfwrite Ghostscript 输出设备)。
fmt = {'ppm', 'tiff', 'png', 'jpeg', 'epsc2', 'pdf'};
outfolder = 'C:\Users\Amro\Desktop\print_test';
parpool(4)
parfor i=1:4
fig = figure(i);
% a random plot
ax = axes('Parent',fig);
plot(ax, cumsum(rand(1000,1)-0.5))
% save in each specified format (-r option is mostly ignored)
for f=1:numel(fmt)
print(fig, ['-d' fmt{f}], '-r920', ...
fullfile(outfolder,sprintf('plot%d.%s',i,fmt{f})));
drawnow
end
% also save FIG-file
hgsave(fig, sprintf('plot%d.fig',i))
close(fig);
end
delete(gcp)
在我看来,您应该导出为 EPS 文件,然后手动将其转换为您需要的任何格式。这样您就可以在调用的 Ghostscript 命令中指定目标图像大小(我不会为print -r 分辨率选项而烦恼,因为它对矢量格式几乎没有影响)
另一种方法是在parfor 中导出FIG 文件。然后,您可以在带有显示器的普通 MATLAB 会话中加载它们,并以所需的分辨率和格式连续打印:
for i=1:4
fig = hgload('plotXX.fig');
movegui(fig, 'center')
print(fig, '-djpeg', '-r920', 'outXX.jpeg')
close(fig)
end