VBSでフォルダ内の画像ファイルサイズを一括変更~HEICも対応!~

中山テック 代表の中山です。

さて最近ゲーム系のブログを多く執筆しておりますが、その際のスクショの数が半端ないです。

実はiPhone12のスクショって、パソコン取り込み後にいい感じに大きいサイズで取り込まれるのです。

そこで!(織田裕二風)

「このスクショを幅1200pxに変更できないかなぁ~」というものぐさ思考が働きました(汗

この1200pxは「Google Search Console」のモバイル・ユーザビリティで警告を受けないギリギリのサイズです。

※当社比

そんな今回は今後楽をするためのツールづくりを、勉強兼ねて作成したのでお話したいと思います。



仕組みの説明の前に「使いたい!」という方向けに完成品のリンクを貼っておきます。

ダウンロードのリンクも乗っているので是非ご活用ください。

HEICファイル未対応バージョン

ダウンロードはコチラになります

上記リンク押下後、「img-sizechange-heic-kouryo-nashi.vbs」をクリック⇒↓マーク(Download Raw Files)をクリックで完了です。

ダウンロード後は「C:¥」配下に「tmp」とかファイルを作成して入れるといい感じです!

※ユーザ配下やデスクトップに入れると動かない場合もあります。2バイト文字や空白まで考慮する時間なし!(汗

HEICファイル対応バージョン

ダウンロードはコチラになります

落とし方は前項と同じなので割愛します。

あと、当ツールと同じ場所に「ConvertTo-Jpeg.ps1」を入れてください。

ダウンロードはこちらからです。

同じようにtmpに入れると確実です

取り扱い説明書

ツール実行まで

※HEIC考慮なし版「img-sizechange-heic-kouryo-nashi.vbs」を例に取ります

まずVBSファイルをダブルクリックします。

画像ファイル格納場所を聞かれます。

パスを入力します。

対象フォルダの上にあるパスをクリック⇒コピー⇒貼り付けが最も楽な流れかと思います。

変換サイズを入れます(数値のみ、pxと入れるとエラー)。

縦か横いずれか大きい方を入力サイズに変換します(指定サイズ未満の場合は何もしません)。

例えば、横2400の縦1200の画像があった場合は「横1200、縦600」の画像に変換されます。

逆に横1200縦2400の場合は「横600、縦1200」の画像に変換されます。

その後変換作業が行われますが、メッセージが出なければ正常終了となります。

ツール実行後

まず画像ファイルが全て「JPG」形式に変換されます。

※他の形式が良い方はご自身で修正するか、お金頂ければ画像選択版を作成します

そして指定通り横が1200で、縦554と比率を守ったうえで変換完了しました。

HEIC対応版との違い

流れがちょっと違います。

1.HEICファイルをJPGファイルに変換

2.変換後ファイル+HEIC以外のファイルを取得

3.サイズ変換

となり、HEICをJPG化する処理だけが追加されています。

また、先述した通り「ConvertTo-Jpeg.ps1」を同じ場所に入れてます。

このツールは別の方が作ったもので、POWER SHELLで実行しJPG変換しています。

あくまでも変換だけですので、サイズ変更を代表作成ツールで実行している形です。



  • 関連記事

プログラム解説

画像処理系はライブラリが充実しており、ステップ数も跳ね上がることなくプログラムが組めました。

処理ごとに説明したいと思います。

フォルダの取得

Option Explicit

Const wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
Const cmd = " | .\ConvertTo-Jpeg.ps1"
Dim imgObj							'画像オブジェクト
Dim imgFolderName					'画像ファイル格納場所名
Dim imgFolderObj					'画像ファイル格納場所
Dim imgExt							'画像ファイル拡張子
Dim imgKakuchoushiChangeAfter		'変更後画像ファイル名
Dim imgKakuchoushiChangeAfterObj	'変更後画像ファイルオブジェクト
Dim imgKakuchoushiChangeAfterFolder '変換後画像ファイル格納先
Dim objFS							'ファイルシステムオブジェクト
Dim imgObjOpen						'イメージ(現在)
Dim baseSize						'基本サイズ
Dim objImgChange					'イメージ(変換後)
Dim imgName							'ファイル名
Dim runFolder

Set runFolder = CreateObject("Scripting.FileSystemObject")

imgFolderName = InputBox("画像ファイル格納場所を教えて")

'===============================
' ファイルシステムオブジェクト作成
'===============================
Set objFS = CreateObject("Scripting.FileSystemObject")

'===============================
' フォルダ存在確認
'===============================
If objFS.FolderExists(imgFolderName) Then
  '===============================
  '入力チェック
  '===============================
  baseSize = CInt(InputBox("変換後サイズを入力。例えば1200pxにしたい場合は1200と入力。\r\n変換は縦横大きい方を基準にして変換します"))
  If baseSize <= 0 Then
    '入力値なし、または0の場合
    Set objFS = Nothing
    WScript.Echo "なんかいれて"
    WScript.Quit
  End If
  '===============================
  ' 存在する場合はフォルダオブジェクト取得
  '===============================
  Set imgFolderObj = objFS.GetFolder(imgFolderName)
  imgKakuchoushiChangeAfterFolder = imgFolderName & "\henkango"
  If objFS.FolderExists(imgKakuchoushiChangeAfterFolder) Then
  Else
    objFS.createFolder(imgKakuchoushiChangeAfterFolder)
  End If

まず初めに画像ファイルが格納してあるフォルダパスを指定します。

パスを入力したらそのフォルダが本当に存在しているかを確認します。

※初回なので、変数も記載しております。

ここはオーソドックスな処理が多く、特筆すべき点はないと思います。

HEICの検索とJPG変換

HEICファイルは画像ファイルでなく、ただのバイナリファイルのようです。

オブジェクト生成時の「WIA~」で処理しようとするとエラーが出るのもあり、間違いないですね。

  '===============================
  ' ConvertTo-Jpeg.ps1を使う
  '===============================
  Dim objWshShell
  Set objWshShell = Wscript.CreateObject("WScript.Shell")←①
  For Each imgObj In imgFolderObj.Files
    imgExt = objFS.GetExtensionName(imgObj.name)
    If imgExt = "heic" or imgExt = "HEIC" Then
      'WScript.echo runFolder.getParentFolderName(WScript.ScriptFullName) & "\ConvertTo-Jpeg.ps1 " & imgObj
      objWshShell.Run "Powershell -ExecutionPolicy Bypass -NoExit " & runFolder.getParentFolderName(WScript.ScriptFullName) & "\ConvertTo-Jpeg.ps1 " & imgObj, 0,false←②
      WScript.Sleep 1000  ' heicファイルが重いことを考慮して1秒待つ←③
    End If
  Next
  Set objWshShell = Nothing

  WScript.Sleep 3000  ' heicファイル終了まで待つ、余裕持って3秒

①は普段使用しないオブジェクト生成を行いますが、これはPowerShell実行のためのオブジェクトです。

②はPowerShell実行コマンドであり「ConverTo-Jpeg.ps1 対象ファイル 0(プロンプトを出さない), 最後のfalseはコマンド終了を待たないにしてます。

って書いてて気づいたのですが、Trueにしたら③いらないのでは・・・改善の余地ありとしておきます(笑)

③PowerShell終わった後3秒スリープし、後述するファイル取得を確実にします。

各ファイルのサイズ変更

  '===============================
  ' サイズ変更
  '===============================  
  For Each imgObj In imgFolderObj.Files
      '===============================
    ' 拡張子チェック
    '===============================
    imgExt = objFS.GetExtensionName(imgObj.name)
    imgName = imgObj.name
      If imgExt = "jpg" or imgExt = "JPG" or imgExt = "jpeg" or imgExt = "JPEG" or imgExt = "png" or imgExt = "PNG" or imgExt = "gif" or imgExt = "TIFF" or imgExt = "tiff" or imgExt = "bmp" Then
      '===============================
      ' イメージファイルオープン
      '===============================
      Set imgObjOpen = CreateObject("WIA.ImageFile")←①

      imgObjOpen.LoadFile(imgObj)
      '===============================
      ' 縦横1200px以上の場合だけ処理
      '===============================
      If imgObjOpen.Width >= baseSize or imgObjOpen.Height >= baseSize Then
        ' 変換後のイメージ
        'WScript.Echo imgName
        Set objImgChange = CreateObject("WIA.ImageProcess")←②

        '===============================
        ' 横か縦、大きい方を1200pxに指定
        '===============================
        If imgObjOpen.Width >= imgObjOpen.Height Then
          '==============================================
          ' 画像の大きさ指定(1つ目の要素)※横長
          '==============================================
          objImgChange.Filters.Add(objImgChange.FilterInfos("Scale").FilterID)  ' フィルターIDセット←③

          objImgChange.Filters(1).Properties("MaximumWidth").Value = baseSize ' 幅
          objImgChange.Filters(1).Properties("MaximumHeight").Value = imgObjOpen.Height * (1200/imgObjOpen.Width)  ' 高さ
        Else
          '==============================================
          ' 画像の大きさ指定(1つ目の要素)※長
          '==============================================
          objImgChange.Filters.Add(objImgChange.FilterInfos("Scale").FilterID)  ' フィルターIDセット
          objImgChange.Filters(1).Properties("MaximumWidth").Value = imgObjOpen.Width * (1200/imgObjOpen.Height)      ' 幅
          objImgChange.Filters(1).Properties("MaximumHeight").Value = baseSize ' 高さ
        End If
        '==============================================
        ' コンバート情報
        '==============================================
        objImgChange.Filters.Add(objImgChange.FilterInfos("Convert").FilterID)  ' フィルターIDセット←④

        objImgChange.Filters(2).Properties("FormatID").Value = wiaFormatJPEG←⑤


        Set imgObjOpen = objImgChange.Apply(imgObjOpen)  '
        imgObjOpen.SaveFile(objFS.GetAbsolutePathName(imgKakuchoushiChangeAfterFolder & "\" & objFS.getBaseName(imgName) & ".jpg"))

         Set objImgChange = Nothing

      End If
      
      Set imgObjOpen = Nothing
    
    End If
    Next
    
    set imgFolderObj = Nothing
  set objWshShell = Nothing

Else
  'フォルダが存在しない場合の処理
  WScript.Echo "フォルダがねーぞ"
End If

set objFS = Nothing
set runFolder = Nothing

①取得したイメージファイルのオブジェクトを生成

②サイズ変更後用のイメージファイルオブジェクトを生成

③「Scale」指定でサイズ変更が可能です。

④「Convert」でどのファイルにするか指定可能です。

※③④はインデックス1と2を指定しており、様々なオプションを追加できる仕組みになっています

⑤JPG形式にします。FormatIDを「{B96B3CAE-0728-11D3-9D7B-0000F81EF32E} 」で指定するだけ

注意点

ユーザ配下に画像を置かないようにしてほしいです。

理由として、ユーザ名に半角スペースが入って上手く読み込めないためです。

※時間ある時に修正版が出せれば・・・

例えばCドライブ配下に「tmp」といったオリジナルフォルダを作成し、ファイルパスを指定するのがベストです。



まとめ


HEIC対応版

HEIC以外(jpg,png等)版

最近ゲームブログを執筆することが増えたのですが、スクショの数がかなり多くなってます。

中でもペイントツール開いて幅1200(縦1200)と直すのが非常におっくうでした。

特にGoogle Search Consoleのモバイル・ユーザビリティは1200幅を超えると警告出る(当社比)ので、ツールが出来て楽になりました!

使えそうだな、と思ったら是非ダウンロードしてみてください!

最後までご覧頂き、ありがとうございました。

※中山テックに掲載しているゲーム画像の著作権、商標権、その他知的財産権は、当該コンテンツの提供元に帰属します


おすすめの記事