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

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

Java Imageクラス (createImage(new MemoryImageSource)) での描画

今回は、画像をImageクラスで描くプログラムを示す。
ここでは格子柄のイメージを書いた。まずはソースコードを下記に紹介する。

import java.awt.BorderLayout;
import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.awt.image.MemoryImageSource;
import java.io.FileOutputStream;
import java.io.IOException;

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

public class DrawTest extends JFrame implements ActionListener {

	int w = 50;
	int h = 50;
	JFrame imgFrame;
	Image img;

	public void ShowImage () {
		//画像を入れる配列の作成
		int [] a = new int [h*w];

		int red = 0;
		int blue = 0;
		int green = 0;

		for (int i = 0; i < h*w; i++) {

		   if (i % 10 == 0) {
		    red = 255;
		    blue = 255;
		    green = 255;
		   } else if (i > 450 && i <= 500) {
			red = 255;
			blue = 255;
			green = 255;
		   } else if (i > 950 && i <= 1000) {
			red = 255;
			blue = 255;
			green = 255;
		   } else if (i > 1450 && i <= 1500) {
			red = 255;
			blue = 255;
			green = 255;
		   } else if (i > 1950 && i <= 2000) {
			red = 255;
			blue = 255;
			green = 255;
		   } else if (i > 2450 && i <= 2500) {
			red = 255;
			blue = 255;
			green = 255;
		   } else {
			red = 0;
			blue = 0;
			green = 0;
		   }

		a [i] = (255 << 24) | (red << 16) | (green << 8 ) | blue;

		}
		img = createImage(new MemoryImageSource(w, h, a, 0, w));

		//解析結果画像の保存
		BufferedImage saveImg = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
		Graphics saveg = saveImg.getGraphics();
		saveg.drawImage(img, 0, 0, null);
		saveg.dispose();
		try {
			FileOutputStream fo = new FileOutputStream (this.writeFile());
			ImageIO.write(saveImg, "png", fo);
			} catch (IOException exc) {
			System.out.println("Save Miss");
		    }
		}

	//出力画像の名前がき
		String writeFile () {
			FileDialog fd = new FileDialog(new Frame(), "保存 (末尾の拡張子をお忘れなく)", FileDialog.SAVE);
			fd.setVisible(true);
			String fullpath = fd.getDirectory() + fd.getFile();
			fd.dispose();
			return fullpath;
		}

	public void actionPerformed (ActionEvent e) {
		String cmd = e.getActionCommand();
		if (cmd.equals("button")) {
			ShowImage();
		}
	}

	DrawTest (String title) {
		setTitle (title);
		setBounds (10, 10, 180, 80);
		setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

		JButton button = new JButton ("Push");
		button.addActionListener (this);
		button.setActionCommand("button");
		JPanel pane = new JPanel();
		pane.add(button);
		getContentPane().add(pane, BorderLayout.CENTER);
	}

	public static void main(String[] args) {
		// TODO 自動生成されたメソッド・スタブ
		DrawTest frame = new DrawTest ("Test");
		frame.setVisible (true);
	}
}

このプログラムの結果は下のイメージになる。

f:id:Aki-Miya:20150218203452p:plain


このプログラム自体ではほとんど意味がないが、

	if (i % 10 == 0) {
	red = 255;
	blue = 255;
	green = 255;

のif文で、ターゲット画像の特定のpixelを指定することで、局所的に色を変えることが可能である。(例えばgetElem値が閾値以上の点を赤に変え、それ以外のpixelを黒に変えるなどできる。)

a [i] = (255 << 24) | (red << 16) | (green << 8 ) | blue;

この部分で、8ビットの画像データに変換している。正確に理解していないので、詳細は検索してほしい。