- 締切済み
イメージマジックの合成
for %%a in (*) do ( for %%b in (*) do ( if not "%%a"=="%%b" ( echo Processing: %%a and %%b magick.exe "%%a" "%%b" -gravity center -composite "%%~na_%%~nb_composite.png" if exist "%%~na_%%~nb_composite.png" ( echo Deleting: %%a and %%b del "%%a" del "%%b" echo Renaming: %%~na_%%~nb_composite.png to %%a rename "%%~na_%%~nb_composite.png" "%%a" ) ) ) ) これだとなぜかうまく合成されません。 どこに問題があるのでしょうか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- luka3
- ベストアンサー率72% (452/621)
>ファイル名を固定せずに実現したい for であっても magick.exe * でも、ファイル名で重ね合わせの順番が決まります。 一番後ろになるべき画像が 00abc.jpg など、それ以外のファイル名より先になる必要があることはご理解ください。 あと自分はいきなりファイルを消すのはあまり好きではないので、できあがりの画像を確認してから消すようにして、かつ1つ上のフォルダに作成するようにするとこんな感じです。 @echo off setlocal cd (画像のあるフォルダ) :: 一番目のファイル名を取得 for %%a in (*) do if not defined fn set "fn=%%~a" :: 画像合成 できあがり画像は1つ上のフォルダに一番目のファイル名で作成 magick.exe * -gravity center -composite "..\%fn%" :: 画像確認 start "" "..\%fn%" :: 確認後にファイル削除 choice /c YN /m データを削除しますか?(Y=削除・N=中止) if /i %errorlevel% equ 1 del /q *.*
- luka3
- ベストアンサー率72% (452/621)
使用している画像がいくつあって、どのような画像なのか不明なのでなんとも回答のしようがありません。 いきなり全ファイルでゴールを目指すのではなく、最初はファイルを2つだけにしてうまくいくか試すとか、なにかの画像が含まれている時だけうまくいかないのではないか確認するとか。 ImageMagickの使い方を探してみたのですが、こちらのページを見ると https://onlinepckan.net/technique/tooltechnique1/imagemagicmixtechnique.html cd (画像のあるフォルダ) magick.exe * -gravity center -composite composite.png で、いいのではないでしょうか。 重ね合わせの順番だけ気をつけて、一番後ろの背景になる画像を 00.jpg、その上に重ねる順番に 01.jpg 02.jpg という名前を付ければよいかと。 試しにImageMagick-7.1.1-41をインストールして、適当な画像を用意して実行したら重ね合わせできました。
補足
使用しているのはPNGとJPGの2枚の画像です。 magick.exe * -gravity center -composite composite.png このやり方だと確かにうまくいくのですが、ファイル名を固定せずに実現したいです
- luka3
- ベストアンサー率72% (452/621)
デスクトップにフォルダ(workとか)を作ってそこに対象の画像ファイルだけを置いて実行してみてください。 それと、処理の流れを見えやすくするためにサブルーチン化した下記で試してみてください。 cd "C:\Users\ユーザー名\Desktop\work" for %%a in (*) do ( for %%b in (*) do ( if not "%%a"=="%%b" call :sub "%%a" "%%b" ) ) goto :eof :sub echo Processing: %1 and %2 C:\フォルダ\command\magick.exe "%~1" "%~2" -gravity center -composite "%~n1_%~n2_composite.png" if exist "%~n1_%~n2_composite.png" ( echo Deleting: %1 and %2 del %1 del %2 echo Renaming: %~n1_%~n2_composite.png to %1 rename "%~n1_%~n2_composite.png" %1 ) else ( echo not exist %~n1_%~n2_composite.png )
補足
試しましたが、やはりファイルが壊れます。 開くと真っ黒でした。
- luka3
- ベストアンサー率72% (452/621)
画像ファイルしかないフォルダで実行しているのかと思いましたが、そうではないようですね。 "CWindowssystem32cmd.exe.txt" という画像と関係ないファイルを合成に使おうとしたため、壊れたファイルが出来上がったと思われます。 forを for %%a in (*.png) do ( for %%b in (*.png) do ( のように画像ファイルだけを拾うようにしましょう。 ただ、%%bでファイル名が出ていないように見えるのが気になります。
補足
画像だけを合成してもなぜか壊れたファイルができあがります。 C:\フォルダ\data\test>cd "C:\Users\ユーザー名\Desktop" C:\Users\ユーザー名\Desktop>for %a in (*) do (for %b in (*) do (if not "%a" == "%b"( echo Processing: %a and %b C:\フォルダ\command\magick.exe "%a" "%b" -gravity center -composite "%~na_%~nb.png" if exist "%~na_%~nb.png" ( echo Deleting: %a and %b del "%a" del "%b" echo Renaming: %~na_%~nb.png to %a rename "%~na_%~nb.png" "%a" ) ) ) ) C:\Users\ユーザー名\Desktop>(for %b in (*) do (if not "背景.jpg" == "%b" ( echo Processing: 背景.jpg and %b C:\フォルダ\command\magick.exe "背景.jpg" "%b" -gravity center -composite "背景_%~nb.png" if exist "背景_%~nb.png" ( echo Deleting: 背景.jpg and %b del "背景.jpg" del "%b" echo Renaming: 背景_%~nb.png to 背景.jpg rename "背景_%~nb.png" "背景.jpg" ) ) ) )
- luka3
- ベストアンサー率72% (452/621)
見た感じ問題はないです。 気になったのは ・このバッチやexeが同じフォルダにあるなら、for は (*) じゃなくて (*.png) と限定した方がいい ・magick.exeはパスがとった場所にあるのか、または本当はフルパスだったのを省略したのか ・magick.exeのコマンドについては不問 あとは、このバッチを実行した際に画面に表示された内容を教えてもらえれば理解が深まるかも
補足
C:\フォルダ\data\test>cd "C:\Users\ユーザー名\Desktop" C:\Users\ユーザー名\Desktop>for %a in (*) do (for %b in (*) do (if not "%a" == "%b"( echo Processing: %a and %b C:\フォルダ\command\magick.exe "%a" composite.png" del "%a" del "%b" echo Renaming: %~na_%~nb_composite.png to %a rename "%~na_%~nb_composite.png" "%a" ) ) ) ) C:\Users\ユーザー名\Desktop>(for %b in (*) do (if not "CWindowssystem32cmd.exe.txt"== "%b" ( echo Processing: CWindowssystem32cmd.exe.txt and %b C:\フォルダ\command\magick.exe "CWindowssystem32cmd.exe.txt" "%b" -gravity center -composite "CWindowssystem32cmd.exe_%~nb_composite.png" if exist "CWindowssystem32cmd.exe_%~nb_composite.png" ( echo Deleting: CWindowssystem32cmd.exe.txt and %b del "CWindowssystem32cmd.exe.txt" del "%b" echo Renaming: CWindowssystem32cmd.exe_%~nb_composite.png to CWindowssystem32cmd.exe.txt rename "CWindowssystem32cmd.exe_%~nb_composite.png" "CWindowssystem32cmd.exe.txt" ) ) ) ) 結果 画像を開くと真っ黒です。
補足
これだと生成された画像が作られないのと確認メッセージが出て困ります。