スポンサーリンク

バッチで,画像を生成・加工・一括処理しよう (WSH/JScriptでImageMagickを呼び出す方法)


WSH JScriptのバッチで,画像を動的に生成・加工する。

複数の画像ファイルを一括して処理する事も,かなり簡単にできる。


WSHから呼び出すActiveX コンポーネントとして,ImageMagickを使う。

ImageMagickとは?
http://tuka.s12.xrea.com/index.xcg?p=...

  • 非常に多くの画像フォーマットに対応している超強力な画像処理ライブラリです
  • COMコンポーネントを登録すれば,WSHでも利用可能


以下は,このImageMagickをインストールして,

WSHスクリプト中から利用するサンプルコード。

  • (1)ImageMagickの導入
  • (2)テストバッチを動作検証(図形編)
  • (3)テストバッチを動作検証(文字列の描画編)
  • (4)画像を大量生成

(1)ImageMagickの導入

下記サイトにアクセス。

ImageMagick Windows版バイナリのダウンロードページ

対応プラットフォームが下記のように記載されているが,Windowsなら基本的に大丈夫。

ImageMagick runs on Windows XP (x86) with Service Pack 3, Windows Vista (x86 & x64) with Service Pack 2, Windows 7 (x86 & x64), ・・・.

ImageMagick-6.7.3-1-Q16-windows-dll.exe
をHTTPでダウンロード。


実行。

Setupウィザードが開くのでNext。

ライセンスに同意してNext。


基本的にNextだが,途中「Select Additional Tasks」という画面になる。

ここでチェックボックスが6つ並んでおり,

一番下の
「Install ImageMagickObject OLE Control for VBScript, Visual Basic, and WSH」
にチェック。
(※忘れると,必要なDLLが展開されない)

参考:

VBScriptについて必死に話し合うスレ
http://hibari.2ch.net/test/read.cgi/t...
>ImageMagickのアンインストールと再インストール
途中の6個あるチェックボックスの一番下に
□ Install ImageMagickObject OLE Control for VBScript, Visual Basic, and WSH
という、チェックの入ってないやつがあっただろう。チェック 入れた?


Next>Installを押下。

インストールが開始する。

完了したら,Next, Finishで終了。

ImageMagickのインストールは完了。



次に,これをCOMコンポーネントとして登録する。

コマンドプロンプトを(Vistaなら)管理者として実行。

下記のコマンドを実行。

regsvr32 "C:\Program Files\ImageMagick-6.7.3-Q16\ImageMagickObject.dll"

ダイアログで
「DllRegisterServerは成功しました。」
と表示されればOK。


導入が完了。


(2)テストバッチを動作検証(図形編)

試しに,WSHバッチからImageMagick呼び出して,簡単な図形を描画してみる。


test1.js

// ImageMagickオブジェクトを生成
var im = WScript.CreateObject("ImageMagickObject.MagickImage.1");

// 黒字にオレンジの四角形を描画
im.Convert(
	"-size", "100x100", // 画像サイズ
	"xc:none",          // 背景を透明に
	"-fill", "orange",  // 塗りつぶし色
	"-draw", "polygon 40,40,40,60,60,60,60,40", // 描画座標
	"hoge.png"          // 保存ファイル名
);

// 終了
im = null;

これだけ。

実行すると,hoge.pngという透過PNGファイルが生成される。



参考:多角形を描画するサンプル(vbs)

ImageMagickとWSHで、バッジ画像を生成する
http://kyle-in-jp.blogspot.com/2008/0...


xc:noneについて
http://matsup.blogspot.com/2009/12/fr...

  • 注意が必要なのが「透明なcanvas」の場合。jpegで出力すると「黒いcanvas」になってしまう。これはjpeg が透明をちゃんと扱えないためで,pngで出力すると確かに透明な背景となっているのがわかる


上記のサンプルからわかるように,

CUIのコマンドのコマンドオプションをWSH側でラッピングして,

Convertメソッドに渡している感じ。



Convertは非常に多機能。


ファイルフォーマットの変換,ぼかし,エンボスなどの画像処理が可能。

ImageMagickによる基本的な画像処理
http://www.envinfo.uee.kyoto-u.ac.jp/...


画像の拡大・縮小もできる。

[ImageMagick][WSH]Jscriptで画像縮小する方法2 (ついでにExifを削除)
http://dqn.sakusakutto.jp/2009/02/wsh...


convertのオプションの一覧は,下記URLから参照可能。

Convert, Edit, or Compose Images from the Command-line
http://www.imagemagick.org/script/com...


なお,Linux上でのconvertコマンドのサンプルにつられてWindows上で同じことをやってしまうと,全く異なるconvertコマンドが起動されてしまうので注意。

WSHから呼び出すのが無難。

FAT ボリュームを NTFS に変換します。

CONVERT ボリューム /FS:NTFS [/V] [/CvtArea:ファイル名] [/NoSecurity] [/X]


  ボリューム  ドライブ文字 (文字の後にはコロンを付ける)、マウント
              ポイント、ボリューム名を指定します。
  /FS:NTFS    ボリュームを NTFS に変換することを指定します。
  /V          詳細モードで変換することを指定します。
  /CvtArea:ファイル名
              NTFS システム ファイルのプレース ホルダにするルート ディレク
              トリの連続ファイルを指定します。
  /NoSecurity 変換されたファイルとディレクトリのセキュリティ設定に、どの
              ユーザーもアクセスが可能になるように指定します。
  /X          必要であれば、最初にボリュームを強制的にマウント解除します。
              ボリュームへの開いているハンドルはすべて無効になります。

(3)テストバッチを動作検証(文字列の描画編)


フォントを指定すれば,文字の描画もできる。

Image Magickで文字を描く
http://blog.livedoor.jp/leaf_hiro/arc...

このWSHバージョンは下記。

// ImageMagickオブジェクトを生成
var im = WScript.CreateObject("ImageMagickObject.MagickImage.1");

// 文字列を描画
im.Convert(
	"-size", "100x100",      // 画像サイズ
	"-font", "msmincho.ttc", // フォントを指定
	"xc:none",               // 背景を透明に
	"label:abc\nde",         // 描画したい文字列
	"hoge.png"               // 保存ファイル名
);

// 終了
im = null;

出力結果は,下記のように改行が加味される。

abc
de

しかし,コード中で日本語を渡すと文字化けしてしまう。

ImageMagickなのですが、日本語文字を画像にするにはどうすれば良いのでしょうか?
http://q.hatena.ne.jp/1208857449
実行した環境の LANG は ja_JP.UTF8 で、labelに渡した引数も UTF8 文字列を渡しています。
試しにSJISやEUCJPの文字列を引数で渡したら文字化けしました。
なので、まず引数の文字コードを確認してみたらいかがでしょうか?

日本語の表示は極めて面倒。あきらめておく。


代わりに,下記のようにして,AAで日本語表記を代用する。


input.txt(へのへのもへじ)

|   ^      ^
|   @   @
|       +
|       +    "
|        `   
|       ^   ,
`---------


jsバッチ側


// ImageMagickオブジェクトを生成
var im = WScript.CreateObject("ImageMagickObject.MagickImage.1");

// 文字列を描画
im.Convert(
	"-size", "100x100",      // 画像サイズ
	"-font", "msgothic.ttc", // フォントを指定
	"xc:none",               // 背景を透明に
	"label:@input.txt",      // 描画したい文字列が書かれているファイル
	"fuga.png"               // 保存ファイル名
);

// 終了
im = null;


「へのへのもへじ」らしきものがPNGファイルで生成される。


(4)画像を大量生成

パラメータを変えながらforループで回せば,

互いに相異なる複数の画像を自動的に大量生成する事が可能。


例えば,適当な顔文字と連番を埋め込んだような画像ファイルを100個作るのも一瞬。

// ImageMagickオブジェクトを生成
var im = WScript.CreateObject("ImageMagickObject.MagickImage.1");

for( var i = 1; i <= 100; i ++ )
{
	var str = "(^_^;)_No." + i;
	var filename = "face" + i + ".png";

	// 文字列を描画
	im.Convert(
		"-size", "100x100",      // 画像サイズ
		"-font", "msgothic.ttc", // フォントを指定
		"xc:none",               // 背景を透明に
		"label:" + str,          // 描画したい文字列
		filename                 // 保存ファイル名
	);
}

// 終了
im = null;


で,これらの画像ファイルを,

開発中のアプリの「顔写真」のダミーとして使ったりできるわけだ。


あとは,Convertの細かいオプションを把握してゆくだけ。

補足

ImageMagickは「画像描画」用のツールではなく,

あくまで「画像処理」のツールだという点に注意。