画像処理アプリケーションその2



その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);
    }
}
これで、画像ファイルを読み込んでピクセルごとに読み込み、そのまま表示する事が できるようになった……と思ったら、このプログラムはうまく動きません(爆) 多分、ファイル名を入力して、画像読み込みボタンを押すと、読み込んだ画像ファイルを 表示するはずです。その後、処理開始ボタンを押すと処理後の画像が表示されるはず なんですけど、全く表示されなくなってしまいました。う〜む、何でだろう。
前へ
次へ
戻る