生物屋さんのためのゼロからのプログラミング

―忘れないための覚書 (たま~に更新)―

EclipseでImageJのPlugin作成 -Time Stamper-

ImageJ(Fiji)には、"Time Stamper"というプラグインが内臓されているが、この"Time Stamper"を実行すると、

IJ.run(imp, "Time Stamper", "starting=0 interval=1
   x=2 y=15 font=12 decimal=0 anti-aliased or=sec");

のようになり、Javaなどで作成するプラグイン内で、intervalを任意の値にするのは不可能であった(僕がざっくり調べたところでは)。(intervalを任意の値にするには、わざわざ"Time Stamper"を使う必要があり、少し効率が悪い)


そこで、今回は"Time Stamper"を使わずに、stack画像にTimeをstampする方法を書く。

コードは下記。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import ij.IJ;
import ij.ImagePlus;
import ij.io.OpenDialog;
import ij.plugin.PlugIn;
import ij.process.ImageProcessor;

public class Time_Stamp implements PlugIn, ActionListener{

	ImagePlus imp;
	ImageProcessor ip;
	JTextField tf; //Frame rateの入力
	int number; //Frame数
	int h; ///画像の高さ
//////////////////////////////////////////////////
	//画像を開く
	public void openFile () {
		//オープンダイアログで画像を開く
		OpenDialog od = new OpenDialog("Open");
		imp = IJ.openImage(od.getDirectory()+od.getFileName());
		ip = imp.getProcessor();
		imp.show();

		//画像のスライス数と高さの取得
		number = imp.getNSlices();
		h = imp.getHeight();
	}
//////////////////////////////////////////////////
	//時間をスタンプする
	public void stamp() {
		//フォントなどの設定
		ip.setColor(Color.white);
		Font font = new Font("Arial", Font.PLAIN, 20);
		ip.setFont(font);

		//Frame rateの取得
		int time = getValue();

		//Timeをスタンプする
		for (int i = 0; i < number + 1; i++) {
			imp.setSlice(i);
			ip.drawString(String.valueOf(i*time), 10, h-10);
		}
	}
//////////////////////////////////////////////////
	//Frame rateの取得
	public int getValue() {
		int time = Integer.parseInt(tf.getText());
		return time;
	}

//////////////////////////////////////////////////
	//コントローラーの作成
	public void run (String arg) {
		JFrame frame = new JFrame ("Stamp");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(10, 10, 160, 150);

		JButton openButton = new JButton ("Open");
		JButton stampButton = new JButton("Stamp");
		openButton.addActionListener(this);
		stampButton.addActionListener(this);
		openButton.setActionCommand("Open");
		stampButton.setActionCommand("Stamp");
		JLabel label = new JLabel ("Frame rate =");
		tf = new JTextField ("10");
		openButton.setBounds (35, 10, 90, 30);
		stampButton.setBounds(35, 50, 90, 30);
		label.setBounds(20, 90, 100, 30);
		tf.setBounds(100, 90, 40, 30);
		JPanel pane = new JPanel ();
		pane.setLayout(null);
		pane.add(openButton);
		pane.add(stampButton);
		pane.add(label);
		pane.add(tf);
		frame.getContentPane().add(pane, BorderLayout.CENTER);
		frame.setVisible(true);
	}

//////////////////////////////////////////////////
	//ボタンを押した時の反応
	public void actionPerformed(ActionEvent e) {
		String cmd = e.getActionCommand();
		if (cmd.equals("Open")) {
			openFile();
		} else if (cmd.equals("Stamp")) {
			stamp();
		}
	}
}

このコードを実行すると、下記のコントローラーが立ち上がる。
f:id:Aki-Miya:20180216125028p:plain
Openボタンを押して、適当なstack画像を選択し開く。(ここでは、前回同様に三浦耕太先生著のImageJではじめる生物画像解析 | 学研メディカル秀潤社の第5章−1 (p197)のサンプル画像"ER-flow.tif"を使用した)
f:id:Aki-Miya:20180216125036p:plain
そして、Stampボタンを押すと、下のようにstack画像にTimeがstampされる。
f:id:Aki-Miya:20180216125046p:plain



キーとなるのは、画像に数値を書き込む下記のコード。

//Timeをスタンプする
	for (int i = 0; i < number + 1; i++) {
		imp.setSlice(i);
		ip.drawString(String.valueOf(i*time), 10, h-10);
	}


意外と簡単に画像に記入できたので、プラグインの作成時に気軽に使えそう。