フリーハンドで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の中の輝度値の取得を目指そうと思う。