如何使用 Ghostscript 将 pgfplots 转换为高质量 PNG 文件?

如何使用 Ghostscript 将 pgfplots 转换为高质量 PNG 文件?

笔记:这不是重复的如何保存 tikz 生成的图形并将其导出为 JPG/PNG 文件。这个问题涉及 Ghostscript 和质量问题。另一个问题不涉及 Ghostscript,因此另一个问题的讨论与 Ghostscript 相关的质量考虑无关。此外,在评论部分,有一条很好的评论应该作为答案发布。


这是我的代码:

\documentclass[border=5pt]{standalone}
\usepackage{pgfplots}
\begin{document}
\begin{tikzpicture}

\begin{axis}[xmin=0, xmax=4, xlabel=x, ylabel=y]
    \addplot[domain=0:4, samples=100, blue, thick] {cos(deg(x))};
\end{axis}

\end{tikzpicture}
\end{document}

当我用它编译时,pdflatex foo.tex我得到了一个高质量的 PDF。以下是 PDF 的屏幕截图:

在此处输入图片描述

现在我尝试将 PDF 转换为 PNG。以下是我第一次尝试-sDEVICE=png16m

gs -sDEVICE=png16m -sBATCH -sNOPAUSE -r300 -sOutputFile=foo1.png foo.pdf

输出的质量相当令人失望。曲线看起来像素化了。斜坡看起来像楼梯。它看起来像这样:

在此处输入图片描述

这是我第二次尝试-sDEVICE=pngalpha

gs -sDEVICE=pngalpha -sBATCH -sNOPAUSE -r300 -sOutputFile=foo2.png foo.pdf

输出效果好多了,但背景是透明的:

在此处输入图片描述

我的问题:

  1. 为什么该png16m设备的输出质量比差那么多pngalpha
  2. 如何pgfplots使用 Ghostscript 生成高质量的图像?

答案1

-sDEVICE=pngalpha相比之下,明显的质量改进-sDEVICE=pn16m是通过应用抗锯齿功能实现的。

根据https://ghostscript.readthedocs.io/en/latest/Devices.html#png-file-format-sDEVICE=pngalpha默认情况下启用抗锯齿功能:

png16malpha 和 pngalpha 设备是 32 位 RGBA 颜色,透明度表示像素覆盖范围。除非明确填充,否则背景是透明的。PDF 1.4 透明文件使用此设备不会提供透明背景。这些设备的不同之处在于 pngalpha 设备默认启用文本和图形抗锯齿。我们现在建议人们优先使用 png16malpha 设备,并通过 DownScaleFactor 参数实现任何所需的抗锯齿,因为这在许多情况下可以提供更好的结果。

对于png16m输出设备,必须明确启用文本和图形的抗锯齿功能。添加选项-dTextAlphaBits=4 -dGraphicsAlphaBits=4

-dTextAlphaBits=n
-dGraphicsAlphaBits=n

这些选项控制子采样抗锯齿的使用。强烈建议使用它们来生成输入文件的高质量光栅化。子采样框 n 的大小应为 4 以获得最佳输出,但可以使用较小的值来加快渲染速度。抗锯齿功能针对文本和图形内容分别启用。

相关内容