我正在使用parfor
循环来生成并保存大量的数字。由于将在图中呈现的数据量,数字的分辨率需要高,大约920dpi。使用普通for
,该函数正常工作。但是当我们切换到parfor
时,生成和保存的图片的分辨率变得非常低。
这是图形句柄创建部分:
mainFig=figure('visible','off');
set(mainFig, 'Renderer', 'OpenGL');
这是保存部分代码:
print(mainFig,'-djpeg','-r920',strcat(MyDir,measure,sec_suffix,'.jpeg'))
任何想法?
由于
答案 0 :(得分:5)
这是无头模式documented limitation printing:
无显示打印和导出
在UNIX平台(包括Macintosh)上,您可以从中开始 MATLAB
nodisplay
模式(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内置栅格格式的大小(在中标识) 图形格式文件中表格的第四列。注意:内置图形格式直接从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"
如您所见,由于某些原因,在将PS文件转换为其他格式时,MATLAB在无头模式下使用固定目标大小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