WSH(JScript) + WIA で画像変換

WSH(Windows Script Host)とWIA(Windows Image Acquisition)を使用してWindowsの標準機能のみで画像操作についての忘却録です。

画像変換

convertImage.wsf<?xml version="1.0" encoding="UTF-16" standalone="yes" ?>
<package>
  <job>
    <script language="JavaScript">
//<![CDATA[
(function() {
  "use strict";

  var wiaFormatBMP  = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}";
  var wiaFormatPNG  = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}";
  var wiaFormatGIF  = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}";
  var wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
  var wiaFormatTIFF = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}";
  var formatSet = {
    "bmp": wiaFormatBMP,
    "png": wiaFormatPNG,
    "gif": wiaFormatGIF,
    "jpg": wiaFormatJPEG,
    "jpeg": wiaFormatJPEG,
    "tif": wiaFormatTIFF
  };

  /**
   * 画像変換(WIA)
   * @param {string} input - 入力ファイルパス
   * @param {string} output - 出力ファイルパス
   * @param {number} [opt_quality=100] - 品質(1~100)
   *                                     JPEG 圧縮の品質を指定する
   * @param {string} [opt_compress] - 不明
   *                                  TIFFでは、圧縮スキームを指定する
   * @return {boolean} 結果
   */
  function convertImage(input, output, opt_quality, opt_compress) {
    var ret = false;
    var fs = new ActiveXObject('Scripting.FileSystemObject');
    var format = fs.GetExtensionName(output).toLowerCase();
    input  = fs.GetAbsolutePathName(input);
    output = fs.GetAbsolutePathName(output);

    if (fs.FileExists(input) && !fs.FileExists(output) && !fs.FolderExists(output)) {
      if (format in formatSet) {
        // ファイル読み込み
        var img  = new ActiveXObject("WIA.ImageFile");
        img.LoadFile(input);

        // 変換
        var ip  = new ActiveXObject("WIA.ImageProcess");
        ip.Filters.Add(ip.FilterInfos("Convert").FilterID);
        ip.Filters(1).Properties("FormatID").Value = formatSet[format];
        if (opt_quality != null) {
          ip.Filters(1).Properties("Quality").Value = opt_quality;
        }
        if (opt_compress != null) {
          ip.Filters(1).Properties("Compression").Value = opt_compress;
        }
        img = ip.Apply(img);

        // ファイル書き込み
        img.SaveFile(fs.GetAbsolutePathName(output));

        img = null;
        ip = null;
        ret = true;
      }
    }
    return ret;
  }

  function main() {
    convertImage('./test.bmp', './test.png');
    convertImage('./test.bmp', './test.gif');
    convertImage('./test.bmp', './test.jpg');
    convertImage('./test.bmp', './test.jpg');
    convertImage('./test.bmp', './test5.jpg', 5);
    convertImage('./test.bmp', './test.tif');
  }

  main();
})();
//]]>
    </script>
  </job>
</package>

参照