PNG图像中的模糊文本通过TikZ和独立包从PDF转换而来

时间:2013-08-28 06:24:18

标签: imagemagick latex imagemagick-convert tikz pgf

使用独立包将pdflatex生成的PDF图像转换为PNG图像时出现问题。

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

我已经查看了这些StackExchange帖子:

并由独立包manual指导我的工作流程设置。但经过对下面代码中各种转换设置的大量实验性调整后,我无法提高输出PNG图像的质量。

我玩过的设置示例:

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

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

这些都不起作用!因此,使用保留图像中渲染文本清晰度和清晰度的独立软件包从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}

1 个答案:

答案 0 :(得分:2)

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

pdflatex tikz.tex
pdflatex tikz.tex

生成的PDF确实将插图包含为 向量 图形,而不是栅格图像。因此,pdfimages -list将无法检测到它。

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

  1. 使用ImageMagick的convert(使用Ghostscript作为'委托' 来处理PDF输入)
  2. 直接使用Ghostscript
  3. 1。将convert-density 720

    一起使用

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

    convert -density 720 tikz.pdf tikz1.png
    

    结果如下:

    tikz1.png

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

    生成的图片大小为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秒。

    分析

    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的输出,字体为pdffonts(即PostScript)字体。它们都作为子集嵌入:

    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大小的PNG),一旦你开始放大,你仍然会看到像素化。这种像素化不会发生在PDF上(因为它的所有形状都被定义为矢量。)

    以下三张图片是截图:

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

    tikz.pdf

    tikz.png

    tikz72.png

    用于坐标轴注释的文本大小仅为10个点左右。如果你光栅化那些,你会在低于400 PPI的任何分辨率下获得清晰可见的像素化,甚至可能高于......


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