3

我正在使用parfor循环来生成和保存大量数字。由于图中将显示的数据量很大,因此数字的分辨率需要很高,大约 920 dpi。使用 normal for,该功能可以正常工作。但是当我们切换到parfor生成和保存的图片的分辨率时,它变得完全低了。

这是图形句柄创建部分:

mainFig=figure('visible','off');
set(mainFig, 'Renderer', 'OpenGL');

这是保存部分代码:

print(mainFig,'-djpeg','-r920',strcat(MyDir,measure,sec_suffix,'.jpeg'))

任何想法?

谢谢

4

1 回答 1

6

这是在无头模式下打印记录限制:

不带显示器的打印和导出

在 UNIX 平台(包括 Macintosh)上,您可以在 MATLABnodisplay模式 ( matlab -nodisplay) 下启动,您可以使用大多数可用于显示器的驱动程序进行打印并导出为大多数相同的文件格式。PostScript 和 Ghostscript 设备都nodisplay在 UNIX 平台上以模式运行。图形设备 -djpeg、、-dpng-dtiff压缩的 TIFF 位图)和-tiff (带有 TIFF 预览的 EPS)也可以工作,但它们nodisplay使用 Ghostscript 来生成输出,而不是使用 MATLAB 中内置的驱动程序。但是,Ghostscript在生成、、和图像文件-r时会忽略该选项 。这意味着您在运行时不能改变图像文件的分辨率 -djpeg-dpng-dtiff-tiffnodisplay模式

-noFigureWindows对于在所有平台上抑制数字的启动选项也是如此。在 Windows 平台上-dwin-dwinc、 和-dsetup选项照常在 -noFigureWindows. 但是,printpreviewGUI 在此模式下不起作用。自然,Windows only-dwin-dwinc输出格式不能在有或没有显示器的 UNIX 或 Mac 平台上使用。

分辨率注意事项

用于-rnumber指定生成的输出的分辨率。通常,使用更高的值会产生更高质量的输出,但会以更大的输出文件为代价。它影响所有 MATLAB 内置栅格格式的分辨率和输出大小(在图形格式文件表的第四列中标识)。

注意:内置图形格式直接从 MATLAB 生成,无需通过 Ghostscript 库进行转换。此外,在无头 ( nodisplay) 模式下,写入某些图像格式不是由内置驱动程序完成的,因为它是在使用显示器时完成的。这些格式是-djpeg-dtiff-dpng。此外,-dhdf-dbmp格式不能在无头模式下生成(但您可以替换-dbmp16m-dbmp。有关不使用显示器时打印的详细信息,请参阅“不使用显示器打印和导出”。

与内置的 MATLAB 格式不同,通过 Ghostscript 生成的图形输出不直接服从-r选项设置。但是,MATLAB 生成的作为 Ghostscript 处理器输入的中间 PostScript 文件会受到-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=pdfwriteGhostscript 输出设备)生成的。

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. 然后,您将在带有显示器的普通 MATLAB 会话中加载它们,并以所需的分辨率和格式连续打印:

for i=1:4
    fig = hgload('plotXX.fig');
    movegui(fig, 'center')
    print(fig, '-djpeg', '-r920', 'outXX.jpeg')
    close(fig)
end
于 2014-07-17T13:30:32.980 回答