TL;DR バージョンは次のとおりです。
foo.gv のグラフから 900 x 1500 ピクセルの PNG 画像を生成するには、次のコマンドを実行します。
dot -Tpng -Gsize=9,15\! -Gdpi=100 -ofoo.png foo.gv
正確に幅 900 ピクセルまたは高さ 1500 ピクセルの画像を生成しますが、両方である必要はありません。その後:
convert foo.png -gravity center -background white -extent 900x1500 final.png
正確に900 x 1500 ピクセルになるように画像を空白でパディングします。ImageMagickスイートのconvert
一部です。
詳細な説明は次のとおりです。
明確にするために:
このbb
属性は "write-only" としてマークされているため、どの Graphviz レイアウト エンジンも、処理前に送信された値を尊重しない可能性があります。
一般に、Graphviz はベクター (スケーラブル) とビットマップ グラフィックスの両方を生成できるため、DPI は必ずしも意味のあるメトリックではありません。
特に、このdpi
属性はビットマップおよび SVG 出力形式でのみ有効です。
Graphviz によって生成された画像のピクセル サイズは、いくつかの相互作用する属性によって駆動されるため、あなたがしようとしていることは少し複雑です。
例として、任意のグラフを見てみましょう。
このコマンドgvgen -dh3
は、次数 3 の有向ハイパーキューブを生成します。(これについてさらに詳しく知りたい場合は、gvgen のマニュアル ページの PDF 版がここにありますが、問題ではありません。デモ用の任意のグラフにすぎません。)
そのグラフのデフォルトのドット生成 PNG レンダリングは、次のコマンドを実行して作成できます。
gvgen -dh3 | dot -Tpng -oexample.png
これを行うと、275 x 347 ピクセルの PNG 形式 (ビットマップ) の画像が得られます。(報告によるとfile example.png
。)
このsize
属性を使用すると、出力イメージの最大または希望の高さと幅をインチ単位で推奨できます。つまり、この属性は、Graphviz に最大でsize=3,5
3 x 5 インチの画像を生成するように指示します。そもそも画像が 3 x 5 より小さい場合、Graphviz はそれをそのままにします。最初に画像が 3 x 5 インチよりも大きい場合、Graphviz は 3 x 5 インチのキャンバスに収まるまで縮小します (元の画像の縦横比を維持します)。
感嘆符を追加すると、size
属性が最大サイズから目的のサイズに変更されます。両方の寸法が指定されたサイズよりも小さい場合、少なくとも 1 つの寸法が指定されたサイズに等しくなるまで図面が拡大されます。
たとえば、次のように実行します。
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -oexample.png
( bash の感嘆符をエスケープすることに注意してください\!
。DOT ファイルでは、単に と記述しsize=3,5!
ます。)
は、288 x 363 ピクセルの画像を生成します。デフォルトよりも両方のサイズがわずかに大きくなります。
ドットはどのようにしてこれらの数字を思いついたのですか? さて、Graphviz のデフォルトの DPI 値は 96 ピクセル/インチです。その解像度では、3 x 5インチのイメージは 288 x 480ピクセルのイメージです。レイアウト エンジンは、寸法の少なくとも 1 つが目的のサイズに一致するまで、単純に画像を拡大しました。
次のように、dpi
属性を使用してデフォルトの DPI 値をオーバーライドできます。
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=200 -oexample.png
生成された画像のサイズは 600 x 757 ピクセルになります。ここでも、Graphviz は、寸法の 1 つが目的のサイズに一致するまで単純に画像を拡大しました (ただし、この解像度では、3 x 5 インチの画像は 600 x 1000 ピクセルの画像になります)。
size
したがって、任意の数のピクセルを含む画像を生成する場合は、 と の両方をdpi
適切に設定する必要があります。
つまり、900 x 1500 ピクセルの画像を作成したいとします。あなたが使用することができます:
gvgen -dh3 | dot -Tpng -Gsize=9,15\! -Gdpi=100 -oexample.png
また
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=300 -oexample.png
あるいは:
gvgen -dh3 | dot -Tpng -Gsize=900,1500\! -Gdpi=1 -oexample.png
(しかし、最後のものは簡単なテストではうまくいくように見えましたが、念のため、より従来の DPI 値に固執することをお勧めします。)
これで問題のほとんどは解決しますが、Graphviz は、いずれかの寸法が指定されたサイズに一致するまで画像をスケーリングするだけであることに注意してください。元の画像の縦横比によっては、探している正確なサイズが得られる場合と得られない場合があります。
ここでratio
属性の出番です。
コマンド:
gvgen -dh3 | dot -Tpng -Gsize=3,5\! -Gdpi=300 -Gratio=fill -oexample.png
探している正確な寸法の画像が表示されるはずですが、いくつかの注意事項があります。
実際には、必要なサイズとはわずかに異なるサイズになることがあります。たとえば、上記のコマンドを実行すると、(900 x 1500 ではなく) 900 x 1472 ピクセルのイメージが得られます。これが丸め誤差によるものかどうかはわかりません。
これを実現するために、Graphviz は各次元でレイアウトを個別にスケーリングする必要があります。画像ではなくレイアウトをスケーリングするのに十分スマートであるため、画像自体が歪むことはありませんが、要求されたアスペクト比がレイアウトの「自然な」アスペクト比とどの程度異なるかによって、水平方向と垂直方向の間隔が少し見える場合があります。変。
ratio
いくつかの異なる値も受け入れます。ドキュメントを参照するか、少し実験して、それらが何をするかを確認してください。
価値があるのは、文字通り、要求している正確なピクセル寸法の画像が必要な場合、私の提案は、Graphviz が 2 つの寸法のいずれかが一致するように画像をスケーリングし、ImageMagickのようなものを使用して画像をパディングすることです。探している正確なアスペクト比に到達します。たとえば、次のコマンド:
convert in.png -gravity center -background white -extent 900x1500 out.png
必要に応じて水平方向または垂直方向の寸法をパディングするin.png
ことにより、900 x 1500 ピクセルのキャンバス ( に保存)の画像 ( から) を中央に配置します。out.png