54508


> 「composite」の合成コマンド  
>  composite -compose over "素材画像名" "素体画像名" "出力画像名"

まず画像の名前一覧と素体の名前を取得して書き出します

[code]

    (FOR %%A in (*_*_123.png) DO FOR %%B in (*.png) DO @echo composite -compose over "%%B" "%%A" "%%B") > temp.bat
    
[/code]

結果

[code]

    C:\hoge>FOR %B in (*.png) DO @echo composite -compose over "%B" "hoge_hoge_123.png" "%B" 
    composite -compose over "hoge_hoge_123.png" "hoge_hoge_123.png" "hoge_hoge_123.png"
    composite -compose over "hoge_hoge_124.png" "hoge_hoge_123.png" "hoge_hoge_124.png"
    composite -compose over "hoge_hoge_125.png" "hoge_hoge_123.png" "hoge_hoge_125.png"
    
[/code]

初めの改行とよく分からない一行と素体+素体の行、計三行が余分なので削除してそれを呼び出します

[code]

    (FOR /F "skip=3 tokens=* usebackq" %%i IN ("temp.bat") DO @echo %%i) > "composite.bat
    CALL "composite.bat"
    
[/code]

結果

[code]

    composite -compose over "hoge_hoge_124.png" "hoge_hoge_123.png" "hoge_hoge_124.png"
    composite -compose over "hoge_hoge_125.png" "hoge_hoge_123.png" "hoge_hoge_125.png"
    
[/code]

一応はこれで動作してくれるのですが  
別のBATを書き出すだとか、書き出した結果を修正して実行させるだとか余りにも不格好です。  
もう少し綺麗にしたいのですが、なにとぞご教授ください。


CC BY-SA 4.0
2019-04-26T03:49:12.120
54494
2019-04-26T21:28:26.350
2019-04-26T18:09:55.093
31483
31483
question
windows batch-file
batを用いてcompositeで画像を合成したい


素体が複数の場合を考えない、とのことですので`*_*_123.png`にマッチするのは１ファイルと言う前提で回答します。

`*.png`の中から`*_*_123.png`を除外すれば目的を達せられそうですので、`IF`で除外してはどうでしょうか？

[code]

    FOR %%A IN (*_*_123.png) DO SET BODY=%%A
    FOR %%B IN (*.png) DO (
        IF NOT "%%B"=="%BODY%" (
           ECHO composite -compose over "%%B" "%BODY%" "%%B"
        )
    )
    
[/code]

意図通りの出力が得られた場合、`ECHO`を削除することで直接コマンドを実行できますので、いったんファイルに出力するなどの処理は不要になります。


CC BY-SA 4.0
2019-04-26T21:28:26.350
54508
2019-04-26T21:28:26.350
4236
54494
answer