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); } }
このプログラムの結果は下のイメージになる。
このプログラム自体ではほとんど意味がないが、
if (i % 10 == 0) { red = 255; blue = 255; green = 255;
のif文で、ターゲット画像の特定のpixelを指定することで、局所的に色を変えることが可能である。(例えばgetElem値が閾値以上の点を赤に変え、それ以外のpixelを黒に変えるなどできる。)
a [i] = (255 << 24) | (red << 16) | (green << 8 ) | blue;
この部分で、8ビットの画像データに変換している。正確に理解していないので、詳細は検索してほしい。