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

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

マウスを置いた点の輝度値を取得し、表示する。

今回は、よく画像解析ソフトにあるマウスを置いた点の輝度値を表示させるツールJavaで書いた。
まずはそのソースコードを下記に記す。

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

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

public class pointTest extends JFrame implements ActionListener {
	
	BufferedImage img;
	DataBuffer buf;
	MyPanel1 mypane1;
	JLabel x;
	JLabel y;
	JLabel value;
	int x0;
	int y0;
	int sig;
	int h;
	int w;
	
	//画像を開く
	public void OpenImage () {
		try {
			File openFile = new File("開きたい画像");
			img = ImageIO.read(openFile);
			h = img.getHeight();
			w = img.getWidth();
			buf = img.getRaster().getDataBuffer();
		} catch (IOException ex) {
			System.out.println("miss");
		}
		
		//画像をフレームに貼る
		JFrame imgFrame = new JFrame ("Open Image");
		imgFrame.setBounds (300, 100, w, h);
		imgFrame.setVisible(true);
		mypane1 = new MyPanel1 (w, h);
		imgFrame.getContentPane().add(mypane1, BorderLayout.CENTER);
		
		mypane1.addMouseListener(new MouseCheck());  
		mypane1.addMouseMotionListener(new MouseCheck());
	}
	
	//画像を張り付ける用のツール
	public class MyPanel1 extends JPanel {
		public MyPanel1 (int width, int height) {
			setSize(width, height);
		}
		
		public void paintComponent (Graphics g) {
			g.drawImage(img, 0, 0, this);
		}
	}
	
	//マウスの動きをモニター
	class MouseCheck extends MouseInputAdapter {
		public void mouseMoved (MouseEvent e) {
			x0 = e.getX();
			y0 =e.getY();
			sig = buf.getElem(y0*w + x0);  //配列を(x, y)座標に変える
			x.setText(String.valueOf(x0)); //intをStringに変換
			y.setText(String.valueOf(y0));
			value.setText(String.valueOf(sig));
		}
	}

	public void actionPerformed (ActionEvent e) {
		String cmd = e.getActionCommand();
		if (cmd.equals("open")) {
			OpenImage();
		}
	}
	
	pointTest() {
		JButton button = new JButton ("Open");
		JLabel xLabel = new JLabel("x = ");
		JLabel yLabel = new JLabel("y = ");
		JLabel vLabel = new JLabel("Value = ");
		x = new JLabel();
		y = new JLabel();
		value = new JLabel();			
		button.addActionListener (this);
		button.setActionCommand("open");
		button.setBounds(40, 10, 90, 30);
		xLabel.setBounds(40, 50, 50, 30);
		yLabel.setBounds(40, 70, 50, 30);
		vLabel.setBounds(40, 90, 50, 30);
		x.setBounds(70, 50, 50, 30);
		y.setBounds(70, 70, 50, 30);
		value.setBounds(85, 90, 50, 30);		
		JPanel pane = new JPanel();
		pane.setLayout(null);
		pane.add(button);
		pane.add(xLabel);
		pane.add(yLabel);
		pane.add(x);
		pane.add(y);
		pane.add(vLabel);
		pane.add(value);
		getContentPane().add(pane, BorderLayout.CENTER);
	}
	
	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		pointTest frame = new pointTest ();
		frame.setTitle("Test");
		frame.setBounds (10, 10, 180, 165);
		frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}

このプログラムを実行すると、下記のようにマウスのいる座標とその輝度値を表示してくれる。
f:id:Aki-Miya:20150224153912p:plain

今回のプログラムで重要な部分は、

		mypane1.addMouseListener(new MouseCheck());  
		mypane1.addMouseMotionListener(new MouseCheck());

と、

	//マウスの動きをモニター
  class MouseCheck extends MouseInputAdapter {
	public void mouseMoved (MouseEvent e) {
		x0 = e.getX();
		y0 =e.getY();
		sig = buf.getElem(y0*w + x0);  //配列を(x, y)座標に変える
		x.setText(String.valueOf(x0)); //intをStringに変換
		y.setText(String.valueOf(y0));
		value.setText(String.valueOf(sig));
	}
  }

の部分である。JLabelのsetTextはStringに対応しているため、

     x.setText(String.valueOf(x0)); //intをStringに変換

でintをStringに変換している。

このツールソースコードが少ない割には、かなり有用であった。