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

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

BufferedImageの画像をZoom in、Zoom Outする。

ここでは、ボタンを押してBufferedImageの画像をZoom inまたはZoom Outするプログラムを書く。
まずは、コードを下記に記す。

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
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;

public class ZoomImage extends JFrame implements ActionListener  {

	BufferedImage img;
	JFrame showFrame;
	MyPanel mypane;
	double x; //倍率
	int h; //画像の高さ
	int w;  //画像の幅
	int ch; //倍率補正した画像の高さ
	int cw; //倍率補正した画像の幅

	//画像を表示する
	public void OpenImage () {
		try {
			img = ImageIO.read(new File("開く画像"));
			h = img.getHeight(); //画像の高さを取得
			w = img.getWidth(); //画像の幅を取得

			x = 1.0; //倍率を1にする

			ch = (int) (h*x);
			cw = (int) (w*x);

			showFrame = new JFrame("Change Size");
			showFrame.setSize (cw, ch);
			showFrame.setLocationRelativeTo(null);
			showFrame.setVisible(true);
			mypane = new MyPanel (cw, ch);
			showFrame.getContentPane().add(mypane, BorderLayout.CENTER);

		} catch (IOException ex) {
			System.out.println("Miss");
		}
	}

	//画像を描画するツール
	public class MyPanel extends JPanel {
		public MyPanel (int w, int h) {
			setSize(w,h);
		}

		public void paintComponent (Graphics g) {
			g.drawImage(img, 0, 0, cw, ch, this);
		}
	}

	//ボタンが押された時のイベント
	public void actionPerformed (ActionEvent e) {
		String cmd  = e.getActionCommand();

		if (cmd.equals("open")) { //Openボタンが押された時
			OpenImage ();
		} else if (cmd.equals("in")) { //Zoom inボタンが押された時
			x = x*1.25;    //1.25倍ずつZoom inする
			ch = (int) (h*x);
			cw = (int) (w*x);
			showFrame.setSize (cw, ch);
			showFrame.repaint();
		} else if (cmd.equals("out")) { //Zoom Outボタンが押された時
			x = x*0.8;  //0.8倍ずつZoom Outする
			ch = (int) (h*x);
			cw = (int) (w*x);
			showFrame.setSize (cw, ch);
			showFrame.repaint();
		}
	}

	ZoomImage () {
		JButton button = new JButton ("Open");
		JButton InB = new JButton ("Zoom In");
		JButton OutB = new JButton("Zoom Out");
		button.addActionListener (this);
		InB.addActionListener(this);
		OutB.addActionListener(this);
		button.setActionCommand("open");
		InB.setActionCommand("in");
		OutB.setActionCommand("out");
		button.setBounds(50, 10, 90, 30);
		InB.setBounds(50, 50, 90, 30);
		OutB.setBounds(50, 90, 90, 30);
		JPanel pane = new JPanel();
		pane.setLayout(null);
		pane.add(button);
		pane.add(InB);
		pane.add(OutB);
		getContentPane().add(pane, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		ZoomImage frame = new ZoomImage();
		frame.setTitle("Zoom");
	    frame.setBounds (10, 10, 200, 170);
	    frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
	    frame.setVisible(true);
	}
}

このプログラムの主要な部分は下記である。

       g.drawImage(img, 0, 0, cw, ch, this);

drawImageの三番目と四番目の要素が画像サイズを指定している。今回のプログラミングでは、これらの値を変えることで“Zoom In”、“Zoom Out”を行った。画像の書き換えは"repaint()" を使用した。

このコードで、開いた画像を1.25倍ずつZoom Inし、0.8倍ずつZoom Outできるはず。