バッチで,画像を生成・加工・一括処理しよう (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の細かいオプションを把握してゆくだけ。