SubstanceDesignerで画像編集する前の前処理

SubstanceDesignerで画像編集する前の前処理

下記記事で書いたように、SubstanceDesignerは本来モデル向け3Dテクスチャを作成するソフトであるため、入出量画像が立てて幅と横幅が2のべき乗のドット数であるという制限がある。

自分は3Dテクスチャ制作用途だけではなくプロシージャル汎用画像編集ソフトとしてSubstanceDesignerを使っているわけだが、2のべき乗制限が邪魔じゃまな事があるので、それをなんとかする仕組みを作って使っている。今回はそれを説明しておく記事。入力前処理編その1。(その2をいつ記事にするかは未定。)

処理の詳細

適切な読み込み方法は2種類あると考える。

  • 画像の比率を保っていればある程度の拡大縮小を許す場合。
    これはSubstancePlayerで画像読み込み時に設定できる方法と同じ。
  • ピクセルの拡大縮小を許さない場合。

後者の前処理をpythonで実装してみた。元画像サイズが2のべき乗に満たない部分を適当なドットで埋めてしまえばいい。

使い方

ソースコードはgitに上がっている。

https://github.com/logicalmodelin/LGMLtools/blob/31cc41359dc3d1fc7aacd007ea5ed1e814def193/blog20221216_blog_header/modifyImageForSubstanceInput.py

コマンドヘルプのみこちらに転載する。

usage: modifyImageForSubstanceInput.py [-h] [-o OUTPUT_IMAGE] [-s SCALE]
                                       [--valign {middle,top,bottom}]
                                       [--align {center,left,right}]
                                       [--resize_force_square RESIZE_FORCE_SQUARE]
                                       [--resize_bg_color RESIZE_BG_COLOR RESIZE_BG_COLOR RESIZE_BG_COLOR]
                                       [--resize_bg_alpha RESIZE_BG_ALPHA]
                                       [--extract_size_image EXTRACT_SIZE_IMAGE | --extract_size EXTRACT_SIZE EXTRACT_SIZE]
                                       {resize,extract} src_image

positional arguments:
  {resize,extract}      resize: 画像をリサイズする。extract: 画像を切り抜く。
  src_image             source image

optional arguments:
  -h, --help            show this help message and exit
  -o OUTPUT_IMAGE, --output_image OUTPUT_IMAGE
                        output image file path
  -s SCALE, --scale SCALE
                        src image scale for resize mode, target image scale
                        for extract mode
  --valign {middle,top,bottom}
  --align {center,left,right}
  --resize_force_square RESIZE_FORCE_SQUARE
                        If True, the output image is square. resize mode only.
  --resize_bg_color RESIZE_BG_COLOR RESIZE_BG_COLOR RESIZE_BG_COLOR
                        resize mode only
  --resize_bg_alpha RESIZE_BG_ALPHA
                        resize mode only
  --extract_size_image EXTRACT_SIZE_IMAGE
                        extract mode only
  --extract_size EXTRACT_SIZE EXTRACT_SIZE
                        extract mode only

おすすめのコマンド利用は以下。一番近い2のべき乗ドット数の大きさの画像内に目的の画像を指定した位置で張り付ける。この例では左上に配置。余白は黒のアルファ0とする。

python modifyImageForSubstanceInput.py resize {リサイズしたい画像のパス} -o {リサイズした画像の保存パス} --valign top --align left --resize_bg_alpha 0

左上、右上、真ん中、左下、右下(および上下真ん中の左右、左右真ん中の上下で合計9か所)の指定が可能。以下はコマンドと結果の例。

元画像 758×578

出力画像は1024×1024となる。位置指定をしないと真ん中になる。

これらの状態になっていれば、完全にピクセルを元のままの状態でSubstanceDesignerに読み込める。

後処理:画像の抽出

SubstanceDesignerから出力した画像から元の沖差の画像をクリッピングする処理もこのコマンドで可能としてある。

python modifyImageForSubstanceInput.py extract {サブスタンスから出力した画像パス} -o {抽出して保存する画像パス} --extract_size_image {前処理で埋め込んだ画像パス} --valign top --align left

位置の指定は前処理と同じで、 –extract_size_image というオプションで埋め込んだ画像パスを与えるとその大きさの画像をクリッピングする。ただし、サブスタンスから出力した画像が入力画像と同じサイズである前提の処理となっている。

python modifyImageForSubstanceInput.py extract {サブスタンスから出力した画像パス} -o {抽出して保存する画像パス} --extract_size 758 578 --valign top --align left

このように、抽出画像サイズを直接指定することもできる。

と、抽出処理も作ってみたが、先の記事に書いた完全透明部分以外をクリッピングする処理のほうが使い勝手がいいので、自分もあまりこちらは使っていない。(のでバグがあるかもしれない。)

その他の処理

–scaleオプションで、元画像を拡大縮小してから埋め込みする機能もある。しかし、整数倍の処理であれば、SubstanceDesigner内で行ったほうがよいかもしれない。

Previous post 画像から不透明部分だけを切り抜く
Next post Houdini:FloodFillをSOPソルバで実装してみた#1