VBScript

画像の一部にぼかしを入れるバッチ処理

Paint.NETなどの画像処理ソフトを使うと、簡単に画像にぼかしを入れることができます。
しかし、大量の画像ファイルに対して処理を行う場合、いちいち手作業で行っていては効率が悪く時間も掛かってしまいます。

そこで、何らかの方法でバッチ処理できないか調べたところ、GIMPを使うとスクリプトを定義してバッチ処理できることが分かりました。

GIMPの準備

使用するGIMPですが、今回は手軽なPortable版を使用します。

  1. GIMP PortableからGIMPPortable_*.*.*.paf.exeファイルをダウンロードして、適当なフォルダにインストールします(今回は「C:\Software\GIMPPortable」フォルダ)。
  2. テキストエディタに下記コードを貼り付けます。
  3. (define (gaussian-blur-batch filename posX posY selWidth selHeight)
      (let* ((image (car (gimp-file-load RUN-NONINTERACTIVE filename filename)))
             (drawable (car (gimp-image-get-active-layer image))))
        (gimp-rect-select image posX posY selWidth selHeight 2 0 0)
        (plug-in-gauss 1 image drawable 50 50 1)
        (gimp-file-save RUN-NONINTERACTIVE image drawable filename filename)
        (gimp-image-delete image)
      )
    )

    上記コードでは、

    ファイル読み込み

    指定した範囲を選択

    ぼかし(ガウス)処理実行

    ファイル保存

    といった処理を行います。
    各工程の引数は必要に応じて変更してください(下図参照)。

    gimp_blur_batch_01

    gimp_blur_batch_02

    gimp_blur_batch_03

  4. 文字コードを「UTF-8N」に、拡張子を「scm」にして、GIMPのスクリプトフォルダにファイルを保存します。Portable版の場合、スクリプトフォルダは「GIMPPortable\App\gimp\share\gimp\2.0\scripts」になります。

作成したスクリプトは、下記のようにコマンドラインからオプション指定で実行することが出来ます。

GIMPPortable -i -b "(gaussian-blur-batch \"C:\\Test\\001.jpg\" 1038 84 270 270)" -b "(gaussian-blur-batch \"C:\\Test\\002.jpg\" 1038 84 270 270)" -b "(gaussian-blur-batch \"C:\\Test\\003.jpg\" 1038 84 270 270)" -b "(gimp-quit 0)"

ただ、複数のファイルを指定するのにいちいちオプションを追加するのは手間なので、手軽に処理できるように簡易的なUIを用意することにします。

HTA製フロントエンド

下記記事でも使いましたが、再びHTAの出番です。

  1. テキストエディタに下記コードを貼り付けます。
  2. <!DOCTYPE html>
    <!--
        GIMPぼかし(ガウス)バッチフロントエンド
        指定したフォルダ内の画像に部分的にぼかし処理をかけます。
        @kinuasa
        
        ※要GIMP(Portable版でも動作可能)
        ※https://www.gimp.org/ からダウンロード
    -->
    <html>
        <head>
            <meta charset="UTF-8">
            <meta http-equiv="X-UA-Compatible" content="IE=10">
            <title>ぼかしバッチフロントエンド</title>
            <style>
                * {
                    font-family: "Segoe UI", Meiryo, "メイリオ", sans-serif;
                    font-size: 11pt;
                }
                table {
                    border-style: none;
                }
                tr, td {
                    border-style: none;
                    padding: 5px;
                }
                input[type="radio"], label {
                    cursor: pointer;
                }
                #btnExec {
                    border-top: 1px solid #96d1f8;
                    background: #65a9d7;
                    padding: 15px 30px;
                    color: white;
                    font-size: 16px;
                    text-decoration: none;
                    vertical-align: middle;
                }
                #btnExec:hover {
                    border-top-color: #28597a;
                    background: #28597a;
                    color: #ccc;
                    cursor: pointer;
                }
                #btnExec:active {
                    border-top-color: #1b435e;
                    background: #1b435e;
                }
            </style>
            <script language="vbscript">
              Option Explicit
              
              Private Sub window_OnLoad()
              'ウィンドウリサイズ・移動
                window.resizeTo 600, 300
                window.moveTo 250, 250
              End Sub
              
              Public Sub rdoSetValue_OnClick()
              '初期値設定
                Dim PosX, PosY, SelWidth, SelHeight
                Dim elm
                Dim v
                
                PosX = 0: PosY = 0: SelWidth = 0: SelHeight = 0
                For Each elm In document.getElementsByName("q")
                  If elm.checked = True Then
                    v = elm.id
                    Exit For
                  End If
                Next
                
                '----------------------------
                '初期値要設定
                '----------------------------
                Select Case v
                  Case "rdo1"
                    PosX = 1038
                    PosY = 84
                    SelWidth = 270
                    SelHeight = 270
                  Case "rdo2"
                    PosX = 476
                    PosY = 102
                    SelWidth = 361
                    SelHeight = 88
                  Case "rdo3"
                    PosX = 53
                    PosY = 1940
                    SelWidth = 345
                    SelHeight = 30
                End Select
                '----------------------------
                
                document.getElementById("iptPosX").Value = PosX
                document.getElementById("iptPosY").Value = PosY
                document.getElementById("iptSelWidth").Value = SelWidth
                document.getElementById("iptSelHeight").Value = SelHeight
              End Sub
              
              Private Sub btnExec_OnClick()
                Dim GimpFilePath
                Dim SrcFolderPath
                Dim PosX, PosY, SelWidth, SelHeight
                Dim iptGimpFile
                Dim iptSrcFolder
                Dim iptPosX, iptPosY, iptSelWidth, iptSelHeight
                Dim Com
                Dim f
                Const FncName = "gaussian-blur-batch" 'GIMP関数名
                
                '入力値取得
                Set iptGimpFile = document.getElementById("iptGimpFile")
                Set iptSrcFolder = document.getElementById("iptSrcFolder")
                Set iptPosX = document.getElementById("iptPosX")
                Set iptPosY = document.getElementById("iptPosY")
                Set iptSelWidth = document.getElementById("iptSelWidth")
                Set iptSelHeight = document.getElementById("iptSelHeight")
                GimpFilePath= iptGimpFile.Value
                SrcFolderPath = iptSrcFolder.Value
                PosX= iptPosX.Value
                PosY= iptPosY.Value
                SelWidth= iptSelWidth.Value
                SelHeight= iptSelHeight.Value
                
                With CreateObject("Scripting.FileSystemObject")
                  '----- 値チェックここから -----
                  If (Len(Trim(GimpFilePath))) < 1 Then
                    MsgBox "GIMPの実行ファイルを指定してください。", vbCritical + vbSystemModal
                    iptGimpFile.Focus
                    Exit Sub
                  End If
                  If .FileExists(GimpFilePath) = False Then
                    MsgBox "[" & GimpFilePath & "]ファイルが見つかりません。" & vbNewLine & _
                           "処理を中止します。", vbCritical + vbSystemModal
                    iptGimpFile.Focus
                    Exit Sub
                  End If
                  If (Len(Trim(SrcFolderPath))) < 1 Then
                    MsgBox "対象フォルダを指定してください。", vbCritical + vbSystemModal
                    iptSrcFolder.Focus
                    Exit Sub
                  End If
                  If .FolderExists(SrcFolderPath) = False Then
                    MsgBox "[" & SrcFolderPath & "]フォルダが見つかりません。" & vbNewLine & _
                           "処理を中止します。", vbCritical + vbSystemModal
                    iptSrcFolder.Focus
                    Exit Sub
                  End If
                  If (Len(Trim(PosX))) < 1 Then
                    MsgBox "横位置(X)を指定してください。", vbCritical + vbSystemModal
                    iptPosX.Focus
                    Exit Sub
                  End If
                  If IsNumeric(PosX) = False Then
                    MsgBox "数値を入力してください。", vbCritical + vbSystemModal
                    iptPosX.Focus
                    Exit Sub
                  End If
                  If (Len(Trim(PosY))) < 1 Then
                    MsgBox "縦位置(Y)を指定してください。", vbCritical + vbSystemModal
                    iptPosY.Focus
                    Exit Sub
                  End If
                  If IsNumeric(PosY) = False Then
                    MsgBox "数値を入力してください。", vbCritical + vbSystemModal
                    iptPosY.Focus
                    Exit Sub
                  End If
                  If (Len(Trim(SelWidth))) < 1 Then
                    MsgBox "選択範囲幅(Width)を指定してください。", vbCritical + vbSystemModal
                    iptSelWidth.Focus
                    Exit Sub
                  End If
                  If IsNumeric(SelWidth) = False Then
                    MsgBox "数値を入力してください。", vbCritical + vbSystemModal
                    iptSelWidth.Focus
                    Exit Sub
                  End If
                  If (Len(Trim(SelHeight))) < 1 Then
                    MsgBox "選択範囲高さ(Height)を指定してください。", vbCritical + vbSystemModal
                    iptSelHeight.Focus
                    Exit Sub
                  End If
                  If IsNumeric(SelHeight) = False Then
                    MsgBox "数値を入力してください。", vbCritical + vbSystemModal
                    iptSelHeight.Focus
                    Exit Sub
                  End If
                  '----- 値チェックここまで -----
                  
                  'コマンド文字列作成
                  Com = """" & GimpFilePath & """ -i "
                  For Each f In .GetFolder(SrcFolderPath).Files
                    Com = Com & "-b ""(" & FncName & " \""" & Replace(f.Path, ChrW(92), ChrW(92) & ChrW(92)) & "\"" " & PosX & " " & PosY & " " & SelWidth & " " & SelHeight & ")"" "
                  Next
                  Com = Com & "-b ""(gimp-quit 0)"""
                  'MsgBox Com '確認用
                End With
                
                'バッチ処理実行
                CreateObject("WScript.Shell").Run Com, 1, True
                If MsgBox("バッチ処理が終了しました。" & vbNewLine & _
                          "対象フォルダを開きますか?", vbInformation + vbYesNo + vbSystemModal) = vbYes Then
                  CreateObject("Shell.Application").Open SrcFolderPath
                End If
              End Sub
              
              Private Sub btnSelectFolder_OnClick()
                Dim f
                With CreateObject("Shell.Application")
                  Set f = .BrowseForFolder(0, "フォルダを選択してください", 0, 0)
                  If Not f Is Nothing Then
                    On Error Resume Next
                    document.getElementById("iptSrcFolder").Value = f.Items.Item.Path
                    On Error GoTo 0
                  End If
                End With
              End Sub
            </script>
        </head>
        <body>
            <table>
                <tr>
                    <td>GIMP:</td>
                    <td colspan="2"><input id="iptGimpFile" type="file" accept=".exe" size="40" title="GIMPの実行ファイルを選択します。"></td>
                </tr>
                <tr>
                    <td>対象フォルダ:</td>
                    <td><input id="iptSrcFolder" type="text" size="40"></td>
                    <td><input id="btnSelectFolder" type="button" value="選択" title="処理対象となるフォルダを指定します。"></td>
                </tr>
                <tr>
                  <td colspan="3">
                    <table>
                      <tr>
                        <td>X:</td>
                        <td><input id="iptPosX" type="text" size="4" title="横位置(X)を指定します。"></td>
                        <td>Y:</td>
                        <td><input id="iptPosY" type="text" size="4" title="縦位置(Y)を指定します。"></td>
                        <td>Width:</td>
                        <td><input id="iptSelWidth" type="text" size="4" title="選択範囲幅(Width)を指定します。"></td>
                        <td>Height:</td>
                        <td><input id="iptSelHeight" type="text" size="4" title="選択範囲高さ(Height)を指定します。"></td>
                      </tr>
                    </table>
                  </td>
                </tr>
                <tr>
                  <td colspan="3">
                    <input type="radio" id="rdo1" name="q" onclick="rdoSetValue_OnClick()"><label for="rdo1"> 初期値1</label>
                    <input type="radio" id="rdo2" name="q" onclick="rdoSetValue_OnClick()"><label for="rdo2"> 初期値2</label>
                    <input type="radio" id="rdo3" name="q" onclick="rdoSetValue_OnClick()"><label for="rdo3"> 初期値3</label>
                  </td>
                </tr>
                <tr>
                    <td colspan="3"><input id="btnExec" type="button" value="処理実行" title="バッチ処理を実行します。"></td>
                </tr>
            </table>
        </body>
    </html>
  3. 文字コードを「UTF-8」に、拡張子を「hta」にしてファイルを保存します。

バッチ処理の実行

  1. 上記手順で作成したHTAファイルを実行します。
  2. 「GIMP」横にある「参照」ボタンをクリックして、事前に準備しておいたGIMPの実行ファイルを選択します。
  3. gimp_blur_batch_04

    gimp_blur_batch_05

  4. 「対象フォルダ」横にある「選択」ボタンをクリックして、処理対象のファイルが保存されているフォルダを選択します。
  5. gimp_blur_batch_06

  6. ぼかしを入れる位置(X, Y, Width, Height)を指定します。「初期値」ボタンを選択することで、あらかじめ設定しておいた値を自動入力することができます。
  7. 処理実行」ボタンをクリックするとバッチ処理が行われ、指定したフォルダ内の画像にぼかしが入ります。
  8. gimp_blur_batch_07

    gimp_blur_batch_08

    gimp_blur_batch_09

    gimp_blur_batch_10

これでようやく手作業でのぼかし処理から解放されました。
今回はじめてGIMPでバッチ処理を行ってみましたが、これはかなり強力な機能だと思います。
リサイズに色調補正、形式変換やシャープ処理など、大量の画像に対して一括処理する需要は多いはずなので、そんなときGIMPが役立つことを実感しました。

参考Webページ

2016年7月の人気記事前のページ

PowerShellからClosedXMLを使ってExcelファイルを作成する方法次のページ

関連記事

  1. Office関連

    Officeファイルから作成者などのプロパティを取得するVBScript

    下記記事でも書いていますが、xlsxやdocxといった、OOXML形式…

  2. VBScript

    Windowsのバージョン情報を取得する

    小ネタです。verコマンドを利用してWindowsのバージ…

  3. VBScript

    Internet Explorerのお気に入りを列挙するVBScript

    Internet Explorerのお気に入りにどの位のインターネット…

  4. VBScript

    動画回転用簡易FFmpegフロントエンド

    アーケードゲームのプレイを録画した際、機器によっては録画した動画の向き…

  5. Windows 10

    Microsoft Update カタログから累積更新プログラムをダウンロードするVBScript

    「累積更新プログラム」とは、その名の通りOSを最新の状態に保つための更…

  6. VBScript

    Acrobatを使ってPDFファイルを結合するVBScript

    「Acrobat PDF 結合 コマンドライン」といったキーワード検索…

コメント

  • コメント (0)

  • トラックバックは利用できません。

  1. この記事へのコメントはありません。

Time limit is exhausted. Please reload CAPTCHA.

最近の記事

アーカイブ

PAGE TOP