その1でImageクラスの使い方について説明をしました。次は、画像を 読み込んだ後に、画像に何らかの処理をしてもう一度表示するプログラムを考えて みましょう。その場合にどうするかと言うと、まず、画像ファイルを読み込まなくては いけません。そのために用意されているのがPixelGrabberクラスです。このクラスで画像 をピクセル単位で読み込めます。実際にプログラムを作ってみましょう。今回は、 下のような画像ファイルを表示するという事を前提にしてます。(サイズ485*88)
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
class gframe2 extends Frame implements ActionListener
{
PixelGrabber pg;
TextField infilename;
Button button1,button2;
Image image;
String filename;
String errormessage = "画像を読み込んでいません";
boolean button1push = false;//画像読み込みボタン
boolean button2push = false;//処理開始ボタン
boolean error = false;//エラーメッセージを出すかどうか判定
int pixel[]=new int[485*88];//ピクセルごとのデータを保存するための配列
gframe2()
{
setLayout(new FlowLayout(FlowLayout.LEFT));
image = createImage(485,88);//画像読み込み用Imageを生成
infilename = new TextField(20);
add(infilename);
button1 = new Button("画像読み込み");
add(button1);
button1.addActionListener(this);
button2 = new Button("処理開始");
add(button2);
button2.addActionListener(this);
}
public void paint(Graphics g)
{
if(error){//error=trueの時エラーメッセージの表示する
g.drawString(errormessage,200,100);
error = false;
}
else{
if(button2push){//error = false,button2push=trueの時、処理開始
image = createImage(new MemoryImageSource(485,88,pixel,0,485));
g.drawImage(image,0,100,this);
g.drawString("処理後",100,200);
button2push = button1push = false;
}
else{error=false,button2push=false,button1=trueの時、画像読み込み
if(button1push){
g.drawImage(image,0,100,this);
g.drawString("処理前",100,200);
}
}
}
}
public void actionPerformed(ActionEvent e)
{
//画像読み込みボタンが押されたらテキストフィールドの画像ファイルを読み込む
if(e.getSource() == button1){
button1push = true;
filename = infilename.getText();
image = Toolkit.getDefaultToolkit().getImage(filename);
repaint();
}
//読み込んだ画像を処理する。(ピクセルごとの処理)
if(e.getSource() == button2){
if(button1push){
pg = new PixelGrabber(image,0,0,485,88,pixel,0,485);//PixelGrabberクラスを生成
try{
pg.grabPixels();//画像を読み込むように指示
}catch(InterruptedException ie){}
for(int i=0;i<485*88;i++){
int p = pixel[i];
int red = 0xff & (p>>16);
int green = 0xff & (p>>8);
int blue = 0xff & p;
pixel[i] = (0xff000000 | red << 16 | green << 8 |
blue); //RGBに分解して、また元に戻す(?)
}
button2push = true;
}
else{
error = true;
}
}
repaint();
}
}
public class TImage2
{
public static void main(String[] args)
{
gframe2 f = new gframe2();
f.setSize(500,300);
f.setTitle("Imageクラスの例その2");
f.addWindowListener(new WindowAdapter(){public void
windowClosing(WindowEvent e){System.exit(0);}});
f.setVisible(true);
}
}
これで、画像ファイルを読み込んでピクセルごとに読み込み、そのまま表示する事が
できるようになった……と思ったら、このプログラムはうまく動きません(爆)
多分、ファイル名を入力して、画像読み込みボタンを押すと、読み込んだ画像ファイルを
表示するはずです。その後、処理開始ボタンを押すと処理後の画像が表示されるはず
なんですけど、全く表示されなくなってしまいました。う〜む、何でだろう。