PerfectVector
著者: Irene Kim2 分で読める

Inkscapeのコマンドライン書き出し:ページ・描画・オブジェクト

InkscapeのコマンドラインPNG書き出しでページ、描画、オブジェクトの境界を選びます。実際の出力を比較し、2サイズを作ってSVGマスターをそのまま保ちます。

目次

InkscapeのコマンドラインでPNGを書き出すときは、先に領域を選びます。--export-area-page はページ枠、--export-area-drawing は描画全体、--export-id はオブジェクトの境界を対象にします。そのオブジェクトだけを見せるなら --export-id-only を加えます。Inkscapeのコマンドラインガイドでは、オブジェクトで切り抜くことと他のオブジェクトを隠すことを区別しています。

その後、出力幅、透明度、ファイル名を明示します。小さな納品バッチを確認し、繰り返しやすくなります。

テストの書き出しで変わったもの

私たちは600 × 360のSVGに、緑のバッジと右端に重なる珊瑚色の色見本の2つの名前付きオブジェクトを作りました。ページには十分な余白があります。描画全体の境界は400 × 180単位、バッジだけは180 × 180です。

公式のInkscape 1.4.4 macOS arm64アプリのコマンドライン実行ファイルで元データを書き出しました。以下の4出力はすべて幅600ピクセルと透明な背景を要求します。

書き出しの選択このテストの出力見える内容
ページ領域600 × 360 PNGページ余白と両オブジェクト。
描画領域600 × 270 PNGより狭い切り抜き内の両オブジェクト。
バッジのID600 × 600 PNGバッジと重なる色見本の一部。
バッジIDと --export-id-only600 × 600 PNGバッジだけ。
書き出し領域とオブジェクトの可視性
実際のInkscapeのPNG出力で、ページ余白、狭い描画境界、重なる色見本を含むオブジェクト切り抜き、分離したバッジを比較
1つのSVGからの実際のInkscape 1.4.4出力。プレビューは各パネルに収まるよう拡大縮小し、透明PNGの後ろに市松模様を置いています。

分離したオブジェクトは狭い境界にも同じ600ピクセル幅を要求するため、PNG内でかなり大きくなります。書き出し領域が変わる場合、出力幅が同じでも図形の縮尺が同じとは限りません。

これらは通常の形状を持つ単一ページSVGの例です。複数ページの選択、フィルター、リンク画像はテストしていません。

安定したオブジェクトIDの元データを作る

次を master.svg として保存します。グループID badge で円とパスをまとめて書き出せます。2つ目の swatch は意図的にバッジ境界を横切ります。

<svg xmlns="http://www.w3.org/2000/svg"
     width="600" height="360" viewBox="0 0 600 360">
  <g id="badge">
    <circle cx="150" cy="160" r="90" fill="#236f62"/>
    <path d="M150 89L190 160L150 231L110 160Z" fill="#cde0a4"/>
    <path d="M150 115L175 160L150 205L125 160Z" fill="#236f62"/>
  </g>
  <rect id="swatch" x="200" y="140" width="260" height="80"
        rx="12" fill="#d68462"/>
</svg>

既存デザインでは書き出しをスクリプト化する前にIDを確認します。編集ソフトの表示名は、コマンドが使うXMLの id と異なる場合があります。SVG編集ガイドは、バックアップを保ちながらマークアップを確認・変更する方法を説明しています。

ページ、描画、分離バッジを書き出す

以下はBashまたはZshの構文です。master.svg があるフォルダーから実行します。まずシェル変数でInkscapeの実行ファイルを指定します。

inkscape_bin=inkscape
mkdir -p exports

この設定は inkscape が PATH にある想定です。通常のmacOSアプリのインストールなら、代わりに /Applications/Inkscape.app/Contents/MacOS/inkscape を使えます。場所に空白がある場合は、代入時にパスを引用符で囲んでください。

ページ全体の場合です。

"$inkscape_bin" --batch-process master.svg \
  --export-type=png --export-area-page \
  --export-width=600 --export-background-opacity=0 \
  --export-filename=exports/page.png

描画の周囲で切り抜く場合です。

"$inkscape_bin" --batch-process master.svg \
  --export-type=png --export-area-drawing \
  --export-width=600 --export-background-opacity=0 \
  --export-filename=exports/drawing.png

バッジ単独の場合です。

"$inkscape_bin" --batch-process master.svg \
  --export-type=png --export-id=badge --export-id-only \
  --export-width=600 --export-background-opacity=0 \
  --export-filename=exports/badge.png

図の重なりの対照条件を再現するには、最後のコマンドから --export-id-only を除き、出力名を変えます。珊瑚色の色見本がバッジの切り抜き内に現れます。IDで切り抜きを選ぶだけでは、図形は分離されません。

Inkscapeマニュアルはこれらのフラグを説明しています。--export-width はビットマップ幅をピクセルで設定し、DPI設定を上書きします。書き出しの縦横比で対応する高さが決まります。各コマンドで領域を1つ選び、明示的な .png 出力パスを使っています。

検証コマンドには --batch-process を含めました。このmacOSの実行では、付けないとPNGを書いてもプロセスが動き続けましたが、上のコマンドは正常に終了しました。このフラグは複数サイズを要求するシェルループとは別です。

マスターを変えず2つのサイズを作る

ページ枠のPNGを2サイズ作るには、同じ範囲設定を繰り返し、幅と出力名だけを変えます。

for export_width in 240 480; do
  "$inkscape_bin" --batch-process master.svg \
    --export-type=png --export-area-page \
    --export-background-opacity=0 \
    --export-width="$export_width" \
    --export-filename="exports/page-${export_width}.png" || exit 1
done

実行では 240 × 144 と 480 × 288 のPNGができました。両方とも同じページ枠と透明背景を維持しました。書き出し前後の master.svg のSHA-256が一致したので、このテストでは元のバイト列は変わりませんでした。

大きな処理へ広げるときは、元データ、領域、サイズを特定できる出力名を使います。コマンドを元ファイルと並ぶスクリプトに保管し、後で選択を再現できるようにしてください。大きな図形フォルダーを処理する前に、最初の出力を確認します。

納品前にファイルを確認する

寸法と見える内容の両方を確認します。コマンドが成功しても、誤った切り抜き、不要な重なり、意図以上の余白が出る場合があります。

  • 大きな空の余白: ページと描画の書き出しを比較し、利用先が想定する枠を選びます。
  • ID切り抜きに別のオブジェクトが出る: --export-id-only が必要か確認します。
  • ビューアーで透明が白く見える: コントラストのある背景でPNGを開きます。元データの白い背景オブジェクトは図形なので、書き出し背景が透明でも見えたままです。
  • 出力間で図形が大きく見える: ピクセル幅とともに書き出し領域も比較します。

InkscapeのPNG書き出しガイドは、これらのページ、描画、選択、背景の概念を説明しています。PNGはラスター納品ファイルなので、編集用にSVGを保持します。元データの実際の内容を確認するなら、SVGファイルガイドを参照してください。

別の自動化と比較する場合は、SharpのSVGからPNGへのガイドでライブラリーのレンダラーとサイズの手順を扱っています。APIオプションをInkscapeへそのまま移すことはできません。

元の図形がPNGやJPGだけなら、書き出し前にPerfectVectorの画像ベクター化ツールで編集可能な図形を準備できます。編集ソフトで復元パスを確認してから、ページ枠とオブジェクトIDを選びます。Inkscapeのビットマップトレースの手順も準備方法の1つです。必要なパスをすでに持つSVGは直接書き出せます。

よくある質問

ページと描画の書き出しでサイズが異なるのはなぜですか? 境界の縦横比が異なる場合があります。このテストでは両方に幅600ピクセルを要求しましたが、600 × 360のページは400 × 180の描画境界より高いPNGを作りました。

export-idに別のオブジェクトが入るのはなぜですか? 対象オブジェクトの書き出し境界を選ぶものだからです。その境界を横切る図形は見えたままの場合があります。他を隠すにはexport-id-onlyを加えます。

このPNGバッチはSVG元データを上書きしますか? 示したコマンドはmaster.svgを読み、別名のPNGを書きます。テスト後の元データのハッシュは同じでした。マスターと納品ファイルを分けて保管し、追加の編集や保存操作はスクリプトへ加える前に確認してください。

参考資料

  1. Inkscape Wiki — コマンドラインの使用 — 書き出し手順と、オブジェクト切り抜きと分離出力の違いを説明しています。
  2. Inkscape — コマンドラインマニュアル — 領域、オブジェクト、サイズ、背景、出力のオプションを説明しています。
  3. Inkscape初心者ガイド — PNGファイルの書き出し — 書き出し領域と透明度の概念を説明しています。

まだベクターパスが必要なら、画像をベクター化して先に結果を確認してください。その後、SVGマスターを保存し、書き出し範囲を1つ選び、最初のPNGの切り抜きと寸法を検証してからバッチを繰り返します。

ブログのその他の記事

編集しやすい
よりきれいなSVGから始めましょう