マクロはImageJの一連のコマンドを自動化する簡単なプログラムです。マクロを作成する最も簡単な方法は,コマンドレコーダーを使って連続したimageJの操作を記録することです。マクロはテキストファイルとして保存され,メニューコマンドを選択したり,マウスのクリックやキーを押すことによって実行されます。
ImageJのwebサイトには90以上のマクロの例があります。例のうちの一つを試すために,そのファイルをダウンロードし,File/Openを使ってダウンロードしたファイルを開いてください。そしてテキストエディタに組み込まれたFile/Run Macroコマンド(ctrl+R)を使ってマクロを起動します。例マクロのほとんどはImageJ内にあるマクロフォルダの中にあります。
例として,一行のHello Worldマクロの作成,インストール,実行を行ってみましょう。始めに,Plugins/Newを使ってエディタ窓を開きます。ダイアログボックス内に, 名前として"Hello_World"を入力し,形式に"macro"を選びます。そして,"OK"をクリックしてください。(名前の下線は,起動の時,ImageJが決める方法です。それはプラグインフォルダ内の".txt"ファイルはマクロとしてインストールされるためです。)
エディタ窓で,下記の様に入力してください。(既に記入されているかもしれません。)
print("Hello World");
マクロをテストするために,エディタのFile/Run Macroコマンドを使います。保存するには,エディタのFile/Save As コマンドを使います。ファイル名にアンダーバー"_"を含み,プラグインフォルダやそのサブフォルダ内にマクロファイルが保存されていれば,そのマクロはImageJを再起動した時,プラグインメニュー内に"Hello World"コマンドとして自動的にインストールされます。Plugins/Shortcuts/Create Shortcutを使ってショートカットキーを作成すればそのキーを押すことによってこのマクロを起動できます。
マクロを再び開くとき,File/OpenかPlugins/Editコマンドを使います。または,Windowsならmacroファイルを"ImageJ"の窓に,Macなら,ImageJアイコン上にドラッグ&ドロップすれば,再度開くことができます。
204を超えるHello WorldプログラムがACMHello World !Webサイトで提供されています。(残念ながらリンク切れです。)
簡単なマクロはコマンドレコーダー(Plugins/Macros/Record)を使用することで作成できます。例えば,選択枠を測定してラベルすると言う下記のようなマクロを作るなら,
run("Measure"); run("Label");
レコーダーを起動してAnalyze/MeasureとAnalyza/Labelコマンドを使うと作成されます。このマクロをプラグインフォルダ内またはサブフォルダ内に"Measure_And_Label.txt"として保存し,ImageJを再起動すると,プラグインメニュー内に新しく"Measure And Label"というコマンドが現れます。Plugins/Shortcuts/Create Shortcutコマンドを使えば,この新しいコマンドにキーボードショートカットを付加できます。
この例では,"MEasure And Label"マクロは"F1キー"を割り当てています。マクロファイル名に含まれるアンダーバー(最低一つは必要)はコマンド名の空白部分に変換されることに注意して下さい。
マクロファイルは一つかそれ以上のマクロキーワードで宣言されたマクロを含むことができます。
macro "Macro 1" {
print("This is Macro 1");
}
macro "Macro 2" {
print("This is Macro 2");
}
この例では,"Macro1"と"Macro2"の二つのマクロが定義されています。これらマクロを試すために,このマクロを選択して,コピー(ctrl+C)します。ImageJに切り替えて,エディタ窓を開きます(Plugins/New)。貼付けて(ctrl+V),エディタのMacro/Installというマクロコマンドを選択します。そして,第一のマクロを実行するためにMacro/Macro1を選択するか,第二のマクロを実行するためにMacro/Macro2を選択します。
この二つのマクロを含むマクロファイルを作成するには,エディタのFile/Save Asを使います。ファイル名は"MyMacros.txt"など何か付け,ImageJフォルダ内のマクロフォルダに保存します(".txt"の拡張子が必須です)。そして,Plugins/Macrosのサブメニューにマクロをインストールするために,Plugins/Macros/Installコマンドを使い,ファイルを開くダイアログボックスから"MyMacros.txt"を選択します。名前を"StartupMacros.txt"に変更して,そのマクロを実行するときにImageJは自動的にマクロをインストールします。
マクロセット内のマクロは,マクロに名前をつけた後,大括弧[]内にショートカットを記載することによってキーボードショートカットを割り当てることができます。
macro "Macro 1 [a]" {
print("The user codessed 'a'");
}
macro "Macro 2 [1]" {
print("The user codessed '1'");
}
この例では,"a"を押すことで,第一のマクロが,"1"を押すことで,第二のマクロが実行します。これらショートカットはEdit/Selection/Select AllやAnalyze/Gels/Select First Laneに対するショートカットを複製します。だから,これらコマンドに対するキーボードショートカットを使うためには,コントロールキー(Macならコマンドキー)を押さなければなりません。組み込みキーボードショートカットの上書きするためにはImageJ1.33またはそれ以降が必要です。
ファンクションキー([F1],[F2]....[F12])とテンキーの数字キー([n0],[n1]...[n9],[n/],[n-],[n+], [n.])もショートカットに使用できます。ImageJはファンクションキーショートカットがプラグインによって使用されているショートカットと二通りある場合,エラーメッセージを表示します。テンキーによるショートカット(ImageJ1.33かそれ以降)では,マクロだけで使用できるので,そうはいきません。PC上では,テンキーショートカットはNum Lockのライトが点灯した時だけ使用できることに注意してください。これ以上の拡張例はKeyboardShortcut.txtで提供されています。
ユーザーは,ユーザーがツールを選んで画像上をクリックするとき,ImageJのツールバーに追加,実行するためのマクロを定義できます。ここでは,マウスでクリックした座標を表示すると言うツールを例にしています。
macro "Sample Tool - C0a0L18f8L818f" {
getCursorLoc(x, y, z, flags);
print("Sample: "+x+" "+y);
}
このツールをインストールするために,エディタ窓を開きます(Plugins/New)。マクロをウィンドウに張り付けエディタのMacros/Install Macrosコマンドを使います。このマクロのファイル名に"StartupMacros.txt"と入力し,マクロフォルダ内に保存します。そうすると,ImageJを起動するときに自動的にインストールされます。マクロファイルは,6種類のツールマクロとツールマクロ以外のマクロならいくつでも含めることができます。マクロファイルの拡張子は".txt"でなければなりません。
これ以上の例はImageJのマクロツールを提供しているサイトかImageJフォルダ内のmacro/toolフォルダ内にあります。これらファイルの一つを開くためにFile/Open(又はドラッグ&ドロップ)を使います。そしてそこに定義されたツールは自動的にインストールされます。もしくは,Plugins/Macros/Installコマンドを使うとエディタ窓を開かなくてもツールをインストールできます。
ツールマクロアイコンは,1文字のコマンドに続いて1かそれ以上の小文字の16進法の桁からなる,簡単で,コンパクトな命令セットを使って定義されます。
Command | Description |
Crgb | set color |
Bxy | set base location (default is (0, 0)) |
Rxywh | Draw Rectangle |
Fxywh | Draw filled rectangle |
Oxywh | Draw oval |
oxywh | Draw filled oval |
Lxywh | Draw line |
Dxy | Draw dot (1.32g or later) |
Pxyxy...xy0 | Draw polyline |
Txyssc | Draw character |
x(x座標),y(y座標),w(幅),h(高さ),r(赤),g(緑),b(青)の部分は,0-15の範囲内の値に特化した小文字の16進法の数字です。文字(T)を描くとき,ssは10進法で表されたポイントサイズで,cはASCII文字です。
ImageJマクロ言語は"Typeless"です。変数を宣言する必要はありません。それにデータ形式を明確にする必要もありません。それらは,代入文内で使用されるときに自動的に初期化されます。変数は数字,文字,配列を含むことができます。実際,同じ変数は異なる時点においてこれらのいくつかが存在します。
後述の例で,数字,文字,配列は同じ変数で割り当てられています。
v = 1.23;
print(v);
v = "a string";
print(v);v = newArray(10, 20, 50);
for (i=0; i<v.length; i++) print(v[i]);
このコードを選択し,コピー(ctrl+C)して,ImageJに切り替え,wエディタ窓を開き(Edit/New),貼付け(ctrl+V),ctrl+Rを押すことでこのコードを実行できます。(Macの場合はctrlキーの代わりにコマンド(アップル)キーを押してください。)
変数名は大文字と小文字を区別します。"Name"と"name"は別の変数を示すことに注意してください。
ImageJマクロ言語は既に普通のJava演算子のすべてがサポートされています。しかし,いくつかの優先順位がそうではありません
Operator(演算子) | codec.(優先順位) | Description(詳細) |
++ | 1 | 前/後増加 |
-- | 1 | 前/後減少 |
- | 1 | 単項差分 |
! | 1 | ブール補数 |
~ | 1 | ビット補数 |
* | 2 | 乗算 |
/ | 2 | 除算 |
% | 2 | 余り |
& | 2 | ビット単位 AND |
| | 2 | ビット単位 OR |
^ | 2 | ビット単位 XOR |
<<,>> | 2 | 左に移動, 右に移動 |
+ | 3 | 追加又は文の連結 |
- | 3 | 減算 |
<,>= | 4 | 未満, 以下 |
>,>= | 4 | より大きい, 以上 |
==, != | 4 | 等しい, 等しくない |
&& | 5 | ブール AND |
|| | 5 | ブール OR |
= | 6 | 値の付与 |
+=, -=, *=, /= | 6 | 演算子付き値の付与 |
if命令文は論理式の値に依存した他の命令文を条件付きで実行します。次のような形式です。
if (condition) {
statement(s)
}
条件が評価されます。もし真なら,コード単位は実行されます。そうでないなら,そのコード単位は跳ばされます。下記の例は,少なくとも一つの画像が開いている場合,アクティブな画像のタイトルを表示し,そうでないなら,実行しないと言うコードです。
if (nImages>0) {
title = getTitle();
print("title: " + title);
}
オプションとして,else命令文をif命令文に付け加えることができます。
if (condition) {
statement(s)
} else {
statement(s)
}
この場合,else後のコード単位は条件が偽の場合に実行されます。下記の例では,もし一つも画像が開いていないなら,"No images are open"というメッセージが表示され,そうでないなら,アクティブな画像のタイトルが表示されます。
if (nImages==0)
print("No images are open");
else
print("The image title is " + getTitle);
"=="演算子と"="演算子が比較のために使用されていることに注意してください。ブレース(大括弧)は,単一の命令文を含むコード単位に対して要求しないのでこの例では無視されます。
マクロ言語はswitch命令文がありません。しかし,if/else命令文を使うことで,シミュレートすることができます。下記はその例です。
type = selectionType();
if (type==-1)
print("no selection");
else if ((type>=0 && type<=4) || type==9)
print("area selection");
else if (type==10)
print("point selection");
else
print("line selection");
ループ命令文はコード単位を繰り返して実行するのに使用します。ImageJマクロ言語は3種類のループ命令文があります。
for (initialization; condition; increment) {
statement(s)
}
initializationは,ループ開始時に一度だけ実行する命令です。conditionは,ループの各繰り返しの始まりで評価し,評価が偽であるときにループを終了します。最後にincrementはループをやり終えたあと,各繰り返しの後に実行する命令です。
下記の例で,forループは0,10,20...90の値を表示するのに使われています。
for (i=0; i<10; i++) {
j = 10*i;
print(j);
}
大括弧は,ループ内に一つだけある命令文があれば無視されます。
for (i=0; i<=90; i+=10)
print(i);
while (condition) {
statement(s)
}
始めに,条件が評価されます。もし,真なら,コード単位は実行され,while命令文が条件の評価とコード単位の実行を条件が偽になるまで継続します。
下記の例では,whileループは0,10,20...90の値を表示するのに使われています。
i = 0;
while (i<=90) {
print(i);
i = i + 10;
}
do {
statement(s)
} while (condition);
ループの開始点で条件を評価する代わりに,do-whileはループが過ぎた時点で条件を評価します。だから,コード単位はいつも少なくとも一回は実行されます。
下記の例では,do...whileループは0,10,20...90の値を表示するのに使われています。
i = 0;
do {
print(i);
i = i + 10;
} while (i<=90);
もしある文字列が他の文字列に含まれているかどうかを確認するのを試すなら,indexOf()関数を使用します。文字列が他の文字列で始まるか,終わるのかどうかを確認するために,startsWith()関数とendsWith()関数を使用します。文字列の部分を抽出するためにsubstring()関数を使います。文字列の長さを測定するためにlengthOf()を使います。
文字列を比較するためには"=="や"!=",">","<"演算子を使います。比較は大文字と小文字を区別します。例えば後述のコードは真を呈します。
ans = "Yes";
if (ans=="yes")
print ("true");
else
print("false");
09/12/03 加筆修正