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

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

フリーハンドでROIを描く。

今回はフリーハンドでROIを描くコードを書いてみた。

仕様としては、画像を取り込み、画像の上にマウスでROIを描けるようにした。


実際のソースコードは下記。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.event.MouseInputAdapter;

public class FreeHandROI extends JFrame implements ActionListener {
	
	BufferedImage img;
	MyPanel mypane;
	int h, w;
	int x0, x1, x2, y0, y1, y2;
	
	//画像を開く
	public void OpenImage () {
		try {
			File openFile = new File("開くファイル名");
			img = ImageIO.read(openFile);
			h = img.getHeight();
			w = img.getWidth();
		} catch (IOException ex) {
			System.out.println("miss");
		}
		
		//画像をフレームに貼る
		JFrame imgFrame = new JFrame ("Open Image");
		imgFrame.setBounds (300, 100, w, h);
		imgFrame.setVisible(true);
		mypane = new MyPanel (w, h);
		imgFrame.getContentPane().add(mypane, BorderLayout.CENTER);
		
		mypane.addMouseListener(new MouseCheck());
		mypane.addMouseMotionListener(new MouseCheck());
	}
	
	//マウスの動きをモニター
	class MouseCheck extends MouseInputAdapter {
		
		//マウスが押された時の反応 :始点を得る
		public void mousePressed (MouseEvent e) {
			x0 = x1 = x2 = e.getX();
			y0 = y1 = y2 = e.getY();
		}		
		
		//マウスがドラッグされた時の反応 : ドラッグしている部分に線を引く
		public void mouseDragged (MouseEvent e) {
			Graphics g = mypane.getGraphics();
			x2 = e.getX();
			y2 = e.getY();
			g.setColor(Color.RED);
			g.drawLine(x1, y1, x2, y2);  //(x1, y1)から(x2, y2)に線を引く		
			x1 = e.getX();   //新しいx1の定義
			y1 = e.getY();   //新しいy1の定義
		}
		
		//マウスが離された時の反応 : 終点から始点に線を引く
		public void mouseReleased (MouseEvent e) {
			Graphics g = mypane.getGraphics ();
			x2 = e.getX();
			y2 = e.getY();
			g.setColor(Color.RED);
			g.drawLine(x2, y2, x0, y0); //マウスを離したpointからマウスを押したpointまでに線を引く
		}			
	}
 	
	//画像を貼りつける用のツール
	public class MyPanel extends JPanel {
		public MyPanel (int width, int height) {
			setSize(width, height);
		}
		
		public void paintComponent (Graphics g) {
			g.drawImage(img, 0, 0, this);
		}
	}
	
	//ボタンを押した時のイベント:画像の取り込み
	public void actionPerformed (ActionEvent ae) {
		String cmd = ae.getActionCommand ();
		if (cmd.equals("Open")) {
			OpenImage();
		}
	}
	
	FreeHandROI () {
		JButton button = new JButton ("Open");
		button.addActionListener(this);
		button.setActionCommand("Open");
		button.setBounds(40, 10, 90, 30);
		JPanel pane = new JPanel();
		pane.setLayout(null);
		pane.add(button);
		getContentPane().add(pane, BorderLayout.CENTER);		
	}
	
	public static void main (String[] args) {
		FreeHandROI frame = new FreeHandROI ();
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setBounds(10, 10, 180, 80);
		frame.setVisible(true);
	} 
}

この部分で、ドラッグした場所に線を引き、マウスを離すとドラッグ開始点まで線を引く。

	//マウスの動きをモニター
	class MouseCheck extends MouseInputAdapter {
		
		//マウスが押された時の反応 :始点を得る
		public void mousePressed (MouseEvent e) {
			x0 = x1 = x2 = e.getX();
			y0 = y1 = y2 = e.getY();
		}		
		
		//マウスがドラッグされた時の反応 : ドラッグしている部分に線を引く
		public void mouseDragged (MouseEvent e) {
			Graphics g = mypane.getGraphics();
			x2 = e.getX();
			y2 = e.getY();
			g.setColor(Color.RED);
			g.drawLine(x1, y1, x2, y2);  //(x1, y1)から(x2, y2)に線を引く		
			x1 = e.getX();   //新しいx1の定義
			y1 = e.getY();   //新しいy1の定義
		}
		
		//マウスが離された時の反応 : 終点から始点に線を引く
		public void mouseReleased (MouseEvent e) {
			Graphics g = mypane.getGraphics ();
			x2 = e.getX();
			y2 = e.getY();
			g.setColor(Color.RED);
			g.drawLine(x2, y2, x0, y0); //マウスを離したpointからマウスを押したpointまでに線を引く
		}			
	}

とりあえず、画像を取り込んでROIが描けるのでOKとした。
次回はROIの中の輝度値の取得を目指そうと思う。