3

我在使用独立包将 pdflatex 生成的 PDF 图像转换为 PNG 图像时遇到问题。

转换后的图像中文本的像素化渲染(PDF->PS->PNG 通过 gs 和 ImageMagick?)非常模糊,质量(清晰度、清晰度等)低于屏幕转储的原始 PDF。

我查看了这些 StackExchange 帖子:

并由独立包手册指导我的工作流程设置。但是在对下面代码中的各种转换设置进行了相当大的实验调整后,我一直无法提高输出PNG图像的质量。

我玩过的设置示例:

  • 密度(增加 dpi)
  • 尺寸(增加/减少尺寸)
  • TikZ 图片宽度/高度尺寸(未找到最佳值,但如果太小,PNG 图像宽度不等于文档类参数中指定的宽度)
  • 使用该command={}选项,我还使用了诸如 -quality 和 - set colorspace RGB 之类的选项(尽管我真的不知道我在这里做什么)

我采取的另一种方法是尝试设置 TikZ 图片的宽度和高度尺寸(以厘米为单位),使其与文档类参数中给出的转换尺寸一致(使用 dpi + 像素 -> 厘米转换器)。

这些都不起作用!因此,对于使用独立包将 PDF 转换为 PNG 的任何帮助,该包可以保留图像中渲染文本的清晰度和清晰度,我们将不胜感激。

作为参考,我正在使用的各种系统/应用程序的版本是:

  • Windows 7的
  • MiKTeX 2.9
  • TeXnicCenter
  • GS 9.09
  • ImageMagick 6.8.6 Q16(32 位)
  • 2013 年 8 月下旬使用 MiKTeX 包管理器安装的独立包

\documentclass[preview,convert={density=300,size=900x300,outext=.png}]{standalone}

\usepackage{tikz}
\usepackage{pgf}
\usepackage{pgfplots}

\begin{document}

\pgfplotsset{every x tick label/.style={at={(1,0)}, yshift=-0.15cm, xshift=-0.0cm,         inner sep=0pt, font=\normalsize}}

\begin{tikzpicture}
\begin{axis}[
no markers, domain=-2.1*pi:2.1*pi, samples=1000,
width=30.0cm,
height=10.0cm,
axis x line*=middle,
x axis line style={densely dotted, opacity=0.75},
axis y line*=middle,
y axis line style={densely dotted, opacity=0.75},
ymin=-1.1,
ymax=1.1,
xtick={-6.28318530717959, -5.65486677646163, -5.02654824574367, -4.71238898038469,     -4.39822971502571, -3.76991118430775, -3.14159265358979, -2.51327412287183, -1.88495559215388, -1.5707963267949, -1.25663706143592, -0.628318530717959, 0, 0.628318530717959, 1.25663706143592, 1.5707963267949, 1.88495559215388, 2.51327412287183, 3.14159265358979, 3.76991118430775, 4.39822971502571, 4.71238898038469, 5.02654824574367,     5.65486677646163, 6.28318530717959},
xticklabels={$-2\pi$, $-\frac{9\pi}{5}$, $-\frac{8\pi}{5}$, $-\frac{3\pi}{2}$, $-\frac{7\pi}{5}$, $-\frac{6\pi}{5}$, $-\pi$, $-\frac{4\pi}{5}$, $-\frac{3\pi}{5}$, $-\frac{\pi}{2}$, $-\frac{2\pi}{5}$, $-\frac{\pi}{5}$, $0$, $\frac{\pi}{5}$, $\frac{2\pi}{5}$, $\frac{\pi}{2}$, $\frac{3\pi}{5}$, $\frac{4\pi}{5}$, $\pi$, $\frac{6\pi}{5}$,     $\frac{7\pi}{5}$, $\frac{\pi}{2}$, $\frac{8\pi}{5}$, $\frac{9\pi}{5}$, $2\pi$},
ytick=\empty,
enlargelimits=false, clip=true, axis on top]
\addplot [line width=0.5,cyan!50!black] {sin(deg(5*x))*cos(deg(x)};
\end{axis}
\end{tikzpicture}
\end{document}
4

1 回答 1

2

为了调查这个问题,我首先从您发布的 tikz/tex 代码中创建了一个 PDF(在将其复制到tikz.tex文件中之后):

pdflatex tikz.tex
pdflatex tikz.tex

生成的 PDF 确实包含作为矢量图形的插图,而不是光栅图像。因此,pdfimages -list不会检测到它。

然后我测试了两种将生成的 PDF 文件转换为 PNG 的方法:

  1. 使用 ImageMagick convert(它在您背后使用 Ghostscript 作为“代表”来处理 PDF 输入)
  2. 直接使用 Ghostscript

1.convert搭配使用-density 720

我使用此命令从 PDF 创建 PNG:

convert -density 720 tikz.pdf tikz1.png

结果如下:

tikz1.png

我为什么用-density 720?因为 720 PPI 是 Ghostscript 在创建-rNxMPDF 时使用的默认分辨率(除非您通过在gs命令行上提供自己的 via 来覆盖此默认设置)...

生成的图像的大小为374 kB(PDF 有49 kB)和像素width x height尺寸。8060 x 2390任何像素化(每当您创建 PNG 时都会发生!)在该分辨率下不会立即可见。

运行此命令 10 次的循环的运行时间为 47 秒。

2.直接使用Ghostscript

为了使用 Ghostscript 命令实现直接 PNG 转换,我使用了:

gs -o tikz-gs.png    -sDEVICE=pngalpha     \
   -dAlignToPixels=0 -dGridFitTT=2         \
   -dTextAlphaBits=4 -dGraphicsAlphaBits=4 \
    tikz.pdf

这是生成的PNG:

tikz-gs

它的文件大小是308 kB,具有8060 x 2390像素尺寸。

运行此命令 10 次的循环的运行时间为 17 秒。

分析

PDF 输入文件:组件的大小

在解压所有对象后查看PDF文件的源代码后,我得出了以下统计数据:

Total size of 5 embedded Type1 fonts................................ 38615 Bytes
Total size of v`/Contents` stream (mainly used by vector drawing)... 32630 Bytes
Rest of PDF structure ("overhead", if you want).....................  5827 Bytes
---------------------------------------------------------------------------------
Total size of PDF (after uncompressing objects)..................... 77072 Bytes

字体是Type 1(即 PostScript)字体,根据pdffonts. 它们都作为子集嵌入:

pdffonts tikz.pdf
 name                       type         encoding         emb sub uni object ID
 -------------------------- ------------ ---------------- --- --- --- ---------
 FXXUVH+CMSY10              Type 1       Builtin          yes yes no       7  0
 BCSIZL+CMR10               Type 1       Builtin          yes yes no       8  0
 SFJZUV+CMMI10              Type 1       Builtin          yes yes no       9  0
 WPSSUY+CMR7                Type 1       Builtin          yes yes no      10  0
 SYHYOI+CMMI7               Type 1       Builtin          yes yes no      11  0

因为...

  • ...字体(除非它们是光栅字体)是一种非常有效地为描绘文本字符的字形编码矢量形状的不同方法,

  • ...字体 + 矢量绘图占 PDF 总大小的 90% 以上,

...地狱没有办法让您从(压缩的)PDF大小49 kB(未压缩的大小为75 kB)创建PNG光栅图像,如果您想避免直接可见,它不会比原始PDF文件大几倍“像素化”和“模糊”。

即使您使用 720 PPI 的分辨率(这会创建一个308 kB-size 的 PNG),一旦开始放大,您仍然会看到像素化。PDF 不会发生这种像素化(因为它的所有形状都定义为矢量)。

以下三张图片为截图:

  • 顶部,从tikz.pdf文件以高缩放级别(~1000%),
  • 中心,来自tikz.png使用 720 PPI(在类似的缩放级别)创建的,
  • 底部,来自tikz72.png使用 72 PPI 创建的(在类似的缩放级别):

tikz.pdf

tikz.png

tikz72.png

用于坐标轴注释的文本大小只有 10 点左右。如果您将它们栅格化,您将在低于 400 PPI 的任何分辨率下获得清晰可见的像素化,甚至可能高于...


我的 Ghostscript 是一个自编译的9.17 GIT PRERELEASE. 我的 ImageMagick 是6.9.0-0 Q16 x86_64.

于 2015-03-25T11:44:25.023 回答