3

スタンドアロン パッケージを使用して、pdflatex で生成された PDF 画像を PNG 画像に変換する際に問題が発生しました。

変換された画像 (PDF->PS-> gs および ImageMagick による PNG) のテキストのピクセル化されたレンダリングは、画面にダンプされた元の PDF よりも非常にぼやけており、品質 (シャープネス、鮮明さなど) が劣っています。

これらの StackExchange の投稿を確認しました。

私のワークフローのセットアップは、スタンドアロン パッケージのマニュアルによってガイドされています。しかし、以下のコードでさまざまな変換設定をかなり実験的に調整した後、出力される PNG 画像の品質を向上させることができませんでした。

私が遊んだ設定のサンプル:

  • 密度 (dpi を増やす)
  • size (寸法の増減)
  • TikZ 画像の幅/高さの寸法 (最適なものは見つかりませんでしたが、小さすぎる場合、PNG 画像の幅は documentclass パラメーターで指定された幅と等しくなりません)
  • オプションを使用して、command={}-quality や - set colorspace RGB などのオプションも試しました (ただし、ここで何をしているのかはよくわかりませんでした)。

私が取った別のアプローチは、TikZ 画像の幅と高さの寸法 (cm 単位) を、documentclass パラメーター間で指定された変換寸法と一致するように設定することです (dpi + ピクセル -> cm コンバーターを使用)。

これはどれもうまくいきませんでした!そのため、画像内のレンダリングされたテキストのシャープネスと鮮明さを維持するスタンドアロン パッケージを使用して PDF から PNG に変換する際の助けをいただければ幸いです。

参考までに、私が使用しているさまざまなシステム/アプリケーションのバージョンは次のとおりです。

  • ウィンドウズ7
  • MiKTeX 2.9
  • TeXnicCenter
  • gs9.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 に変換する 2 つの方法をテストしました。

  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 が PDFを作成するときに使用するデフォルトの解像度であるため(コマンドラインで独自の via-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 回実行するループの実行時間は 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% 以上を占め、

49 kB...(圧縮された)PDFサイズ(非圧縮サイズは)からPNGラスター画像を作成できる方法はありません。75 kB直接表示したくない場合は、元のPDFファイルの数倍大きくありません「ピクセル化」と「ぼかし」。

720 PPI の解像度を使用した場合でも (308 kBサイズの PNG を作成します)、ズームインを開始するとピクセル化が表示されます。このようなピクセル化は PDF では発生しません (すべての形状がベクトルとして定義されているため)。

次の 3 つの画像はスクリーンショットです。

  • 上、tikz.pdf高ズーム レベル (~1000%) のファイルから、
  • 中央、tikz.png720 PPI (同様のズーム レベル) で作成されたものから、
  • 下、tikz72.png72 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 に答える