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(); } } }
このコードを実行すると、下記のコントローラーが立ち上がる。
Openボタンを押して、適当なstack画像を選択し開く。(ここでは、前回同様に三浦耕太先生著のImageJではじめる生物画像解析 | 学研メディカル秀潤社の第5章−1 (p197)のサンプル画像"ER-flow.tif"を使用した)
そして、Stampボタンを押すと、下のようにstack画像にTimeがstampされる。
キーとなるのは、画像に数値を書き込む下記のコード。
//Timeをスタンプする for (int i = 0; i < number + 1; i++) { imp.setSlice(i); ip.drawString(String.valueOf(i*time), 10, h-10); }
意外と簡単に画像に記入できたので、プラグインの作成時に気軽に使えそう。