画像を自動連結する方法を教えてください。(UWSCなど利用)



あるフォルダの中に画像が並んでいます(昇順)
例P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12・・・・

★画像をいくつか選択してあるときに、選択されている画像の3番目~6番目の画像を4連結して3番目の画像の名前にしてほしいのです。

例・上記のP1が選択された状態で実行すると、左上P3、右上P4、左下P5、右下P6という形で1枚の画像が連結され、それがP3という名前で保存されます。

フォルダ内で、何個選択してあっても、同様にしてほしいのです。

使用するソフトは、UWSCを基軸に、画像はペイントかVIX221かJtrimかEasyピクト1.30あたりでお願いしたいです。ぜひスクリプトを教えて下さい。

よろしくお願いいたします。

回答の条件
  • 1人10回まで
  • 登録:2009/12/27 03:54:05
  • 終了:2010/01/03 03:55:02

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912009/12/28 22:43:50

ポイント60pt

準備1

ImageMagic(下記のImageMagick-6.5.8-8-Q16-windows-dll.exeでよいでしょう) をインストールしてください。

http://www.imagemagick.org/www/binary-releases.html#windows


準備2

あらかじめ対象フォルダに list.txt を作成してください。手順は、

(1) ファイル名を指定して実行から、「cmd」を実行

(2)開いたコマンドウィンドウで下記を実行(パスは実際のもの)

C\>CD /D "D:\Image Data"

(3)下記を実行

D:\Image Data>DIR /B *.jpg>list.txt

これで、list.txt が作成されるので中身を必要に応じて編集してください。

上から4ファイルずつをまとめていきますので、順番や組み合わせもここで変更できます。


下記のスクリプトの★の部分を実際のパスに変更し、適当な名前で拡張子 .vbs で保存します。

(場所は画像フォルダと同じでもかまいません)。

'------------------------------------------------------------------
Option Explicit
'------------------------------------------------------------------

'★★ 実際の画像データのパスに変更
Const folderPath = "D:\Image Data"

'★★ 実際のインストールパスに変更
Const imPath = "C:\Program Files\ImageMagick-6.5.1-Q16"

Dim objShell
Set objShell = CreateObject("WScript.Shell")

Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject") 
 
Dim listFiles
listFiles = Split( objFSO.OpenTextFile( folderPath & "\list.txt" ).ReadAll(), vbNewLine )

Dim commandPath
commandPath = """" & imPath & "\convert"""

Dim i
Dim dstFilePath

For i=3 To UBound( listFiles ) Step 4
    dstFilePath = """" & folderPath & "\" & Replace( listFiles(i), ".jpg", "_All.jpg" ) & """"

    '---- リストの1番目と2番目を横に結合 ⇒ ab.jpg
    objShell.Run commandPath & " +append """ _
                     & folderPath & "\" & listFiles(i-3) & """ """ _
                     & folderPath & "\" & listFiles(i-2) & """ """ _
                     & folderPath & "\ab.jpg""", 0, True

    '---- リストの3番目と4番目を横に結合 ⇒ cd.jpg
    objShell.Run commandPath & " +append """ _
                     & folderPath & "\" & listFiles(i-1) & """ """ _
                     & folderPath & "\" & listFiles(i) & """ """ _
                     & folderPath & "\cd.jpg""", 0, True

    '---- リストの ab.jpg と cd.jpg を縦に結合
    objShell.Run commandPath & " -append """ _
                     & folderPath & "\ab.jpg"" """ _
                     & folderPath & "\cd.jpg"" " _
                     & dstFilePath, 0, True

    '---- 作業ファイル(ab.jpg, cd.jpg) を削除
    If objFSO.FileExists( folderPath & "\ab.jpg" ) Then
        objFSO.DeleteFile folderPath & "\ab.jpg", True
    End If
	If objFSO.FileExists( folderPath & "\cd.jpg" ) Then
        objFSO.DeleteFile folderPath & "\cd.jpg", True
    End If
Next

以上で *_All.jpg が作成されると思いますが、どうでしょうか。

id:naranara19

Mookさん、ありがとうございます!

やってみたのですが、(2)、(3)でつまってしまっています。

C:\Users\naranara19>C\>CD /D "D:\Image Data"

'C\'は、内部コマンドまたは外部コマンド、

操作可能なプログラムまたはバッチ ファイルとして認識されていません。

C:\Users\naranara19>D:\Image Data>DIR /B *.jpg>list.txt

'D:\Image'は、内部コマンドまたは外部コマンド、

操作可能なプログラムまたはバッチ ファイルとして認識されていません。

と出てしまいます。

どうしたらよいでしょうか?ちなみに試しとして、デスクトップ上にgazouというフォルダをつくってそのなかに画像ファイルを多数入れてみています。


また、先のご質問ですが、連結された画像はファイル内に何個かできることになっていますが、それらが名前の昇順に並び変えたときに3番目にどれもくるようにしてほしいということです。

例 P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12

とあって、P1と、P7を指定したら、それぞれ、P3-P6、P9-12と連結されたファイルが生成されると思います。

フォルダ内を並び変えたときに、

P1,P2,P3-P6,P3,P4,P5,P6,P7,P8,P9,P9-12,P9,P10,P11,P12

というようになれば幸いですという意味です。

2009/12/29 00:41:07
  • id:naranara19
    ありがとうございます。縦400×横600か、縦562×横750のどちらかで、連結される画像に関しては4枚ともすべてどちらか一つに統一されているといたします。(連結されない1枚目、2枚目は異なることがあります。)
  • id:Mook
    コマンドベースであれば、ImageMagic などが使えそうですが、GUI が必須でしょうか。
    画像データはオリジナルは別保存してあると思いますが、上書き保存もちょっと抵抗がある気がします。
  • id:naranara19
    こんにちは!Mookさん、いつもありがとうございます。GUIは必要ありません。必要最小限程度で結構です。難しいのであればフォルダ内に新しいフォルダを作成して作成される形でももちろんかまいません。なお、番号はP1880270、P1880271、P1880273などと、順番には並んでいますが、数字が少し飛んでいることがあります。よろしくお願いいたします。
  • id:Mook
    コマンドとなると、ファイルの指定をする方法が必要ですが、処理をしたいファイルは
    どのくらいあるのでしょうか。

    すべてのファイルをあらかじめリストにしたり(その場合上から4行ずつ処理をするでもOKですか?)、
    EXCEL を使用したりすることは可能ですか?
  • id:naranara19
    エクセルはなるべく使用したくないと思っております。

    画像数はフォルダ内にだいたい200個くらいあるケースが多いです。
    できれば、フォルダ内の画像を選択した状態で行うと、それぞれその2つあとのものから5つあとのものまでが連結するようにしたいのです。

    難しいようであれば、一度、すべて画像の名前をP100からP101、P102(すべてJPEG)・・P301、P302など、1つずつ画像の名前をつくっておきますので、それに対しての処置でもかまいません。

    何度もご質問くださいませ。いつも感謝しております。
  • id:Mook
    コマンド処理する際は、Window 内の配置情報や選択状況は使用できないと考えてください。
    名前順で並んでいたとしても、コマンド上はフォルダ内のファイルをすべて名前順で並べ替えて
    処理をすることになります。

    そういう意味では、UWSC は位置情報が使用できますから、また違ったやり方ができるかもしれません。

    200からのファイルがあるとのことですが、その名前を処理用に管理(変更)することは問題ないのですか。
    であればたとえば、P100~P103、P200~P203、P300~P303、というように先頭の部分が同じで最後尾が
    0~3 をまとめるという仕様でもよいでしょうか。




  • id:naranara19
    ご指摘ありがとうございます!UWSCは、それであったらよいというだけで、他のよい手段があれば、そちらを優先してくださってかまいません。

    名前を変更するのは、フォルダ内を昇順に並び変えたときに連結画像が3番目にくれば問題ないです。
  • id:Mook
    コマンドは不慣れのようですね。コマンドでの入力は赤い文字だけです。
    デスクトップはパスの指定が難しいのでDドライブ直下に画像フォルダを移動してみてはどうでしょうか。
    (デスクトップはたぶん C:\Documents and Settings\naranara19\デスクトッピ のようだと思いますが、
    Windows のバージョン やユーザ設定で変わるので )


    D の直下に GAZOU フォルダを作成した場合、コマンドは

    CD /D D:\GAZOU
    DIR *.jpg>list.txt

    です。
  • id:Mook
    名前に関しては、なにかご自身での仕様を考えていらっしゃるようですが、
    >P1,P2,P3,P4,P5,P6,P7,P8,P9,P10,P11,P12
    とあったときに、
     ・このなかのどの4つを連結するか
     ・出力ファイル名は何にするか
    というのはプログラムに明確に(具体的に)指定しなければなりません。
    (なぜ P1, P2 は処理しないかも不明です。)

    リストを作成した意図はこれを指定するためのもので、リストの先頭から4ファイルずつ
    処理しますから、P1,P2が対象外であれば事前にリストから削除する必要があります。
    (ファイル名の表示順番はWindows のバージョンでも異なります。)

    ですから、並び順といわずに、意図した順番になるような命名則を規定した方が良いと思います。
    例えば下記のようにソースの名前を準備し、合成ファイルを作成するようにすれば、並べたときには
    各グループの先頭に合成ファイルが並ぶようになるでしょう。
      P001-01.jpg, P001-02.jpg, P001-03.jpg ,P001-04.jpg ⇒ P001-00.jpg
      P002-01.jpg, P002-02.jpg, P002-03.jpg ,P002-04.jpg ⇒ P002-00.jpg
      P003-01.jpg, P003-02.jpg, P003-03.jpg ,P003-04.jpg ⇒ P003-00.jpg

    このあたり難しいようでしたら、もう少し運用環境のご説明を頂けるでしょうか。
  • id:naranara19
    知識のない私に、ご丁寧にありがとうございます!
    D直下でやってみました!

    おかげさまで、コマンド部分ができました。

    vbsファイルの★★を、それぞれ下記のように書き換えて、GAZOUフォルダ内に保存してみました。
    D:\GAZOU
    "C:\Program Files\ImageMagick-6.5.8-Q16"


    その後、vbsファイルをダブルクリックしてみたのですが、


    スクリプト: D:\GAZOU\renketsu.vbs
    行: 9
    文字 :18
    エラー:ステートメントの末尾が不正です。
    コード: 800A0401
    ソース: Microsoft VBScript コンパイルエラー

    となってしまいました。
    どうすればよろしいでしょうか?
    お手数をおかけしていますので、ポイントは増額する予定です。
    いつも大変助かっております(すぐにではなくて結構です。本当にありがとうございます)
  • id:Mook
    Const imPath = "C:\Program Files\ImageMagick-6.5.8-Q16"
    のように、パスの前後が "" で閉じていますか?

    提示されたエラーは、"の不整合の際に見受けられるエラーです。
    ご確認ください。
  • id:naranara19
    助かりました。確かに"がおかしかったです。""と2つ入れたままになっておりました。
    コマンドは2つともはいったのですが、VBスクリプトがうまく実行されません。
    ダブルクリックもしてみたのですが、変化なしです。
    何から何まですみません。
  • id:Mook
    エラーがないということは、VBS としてはうまく動いているのだと思いますが、
    list.txt の中身は処理したいファイルが4つ以上存在していますか?
  • id:Mook
    一応こちらでは動作確認して動いたスクリプトですので、list.txt や変更点に
    問題がないか今一度ご確認ください。

    申し訳ありませんが次回の確認は新年2日の夜になりますので、ご了承ください。
  • id:Mook
    未解決な状態でポイントをいただきすみません。

    解決するまで不明な点がありましたら回答しますのでコメントください。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません