Nanashi-softプログラマ専用Javaアプリケーション


◇Javaアプリケーション-int配列からImageを作る-

◎直接データを書き替える方法
ローレベルで処理するのが好きなタイプの私は,画面に点を打つにも RGBでデータを入れて行う方が安心できます
Javaには Int型でデータを格納して,それを Imageに変換して表示を行う方法が用意されています

◎データの生成
まずはグローバル変数を用意

public class fst extends Frame{
  //裏画面用変数
  static int backimage[] = new int[240*240];

この変数に,データを格納します

・格納順序
☆→○○○○○○
●○○○○○○○
○○○○○○○○

左上の点☆から右方向に1ドットずつ,右端まで来ると,次の行の先頭●に来ます
そして,また右端まで来ると,次の行へを繰り返します

変数で表すと以下のような順になります
backimage[0] backimage[1]〜backimage[238] backimage[239]
backimage[240] backimage[241]〜backimage[478] backimage[479]
backimage[480] ...  
...    


・データの中身
αRGBを 8bit単位です
分かる人にはこれでわかり,わからない人には少々説明しても分からないので省きます

はっきり分かるように,基本色を書いておきます
0xFFFFFFFF
0xFFFF0000
0xFF00FF00
0xFF0000FF
0xFFFFFFFF
藍色 0xFF2B4B65
※藍色はRGB(43,75,101)です

格納時のソース例

int red = 43;
int green = 75;
int blue = 101;
backimage[x + y * 240] = 0xFF000000 + (red << 8) + (green << 4) + blue;

◎Imageへの変換
MemoryImageSourceを用いて行います
この関数は java.awt.image以下のクラスに属しますので,宣言追加が必要になります

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

それから,paint内で実画面にコピーします

        g.drawImage(createImage(new MemoryImageSource(240,240,backimage,0,240)), 0, 0, this); 

一度に記述しているので分かり辛いのですが,順番に考えると簡単です

//MemoryImageSourceクラスを生成し,backimageデータを格納する
MemoryImageSource mis = new MemoryImageSource(240, 240, backimage, 0, 240);
//MemoryImageSourceから Imageクラスを生成する
Image img = createImage(mis);
//生成した Imageを実画面にコピーする
g.drawImage(img, 0, 0, this);

◎サンプルソース

import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

public class fst extends Frame{
  //裏画面用変数
  static int backimage[] = new int[240*240];
  //描画中フラグ
  static Boolean pflg=false;

  public static final void main(final String[] args){
    //ウィンドウ生成
    Frame app=new Frame();
    //タイトル設定
    app.setTitle("Title");
    //ウィンドウサイズ設定(タイトルや枠も含んだサイズ)
    app.setSize(240, 240);
    //キャンバスを配置
    fstCanvas cvs=new fstCanvas();
    app.add(cvs);
    //ウィンドウ表示
    app.setVisible(true);
    //60fps制御用変数初期化
    long t1 = System.currentTimeMillis();
    //無限ループ
    while (true){
      //描画チェックフラグが立っていなければ描画する
      if (pflg == false){
        //座標用変数
        int x, y;
        //カラー用変数
        int red, green, blue;

        //ランダムに座標を生成
        x = (int)(Math.random() * 240);
        y = (int)(Math.random() * 240);

        //ランダムにカラーを生成
        red = (int)(Math.random() * 256);
        green = (int)(Math.random() * 256);
        blue = (int)(Math.random() * 256);

        //裏画面に点を描画
        backimage[x + y*240] = 0xFF000000 + (red << 8) + (green << 4) + blue;

        //描画中フラグを立てる
        pflg = true;
        //画面再描画
        cvs.repaint();
        //60fpsになるようにウェイトを入れる
        while (t1 + 1000/60 < System.currentTimeMillis()){
        }
        //次のフレーム用の時間に進める
        t1 += 1000/60;
      }
    }
  }

  static class fstCanvas extends Canvas{
    public void paint(Graphics g){
      //描画中フラグが立っていたら処理する
      if (pflg == true){
        //裏画面を実画面にコピー
        g.drawImage(createImage(new MemoryImageSource(240,240,backimage,0,240)), 0, 0, this); 
        //描画中フラグをクリア
        pflg = false;
      }
    }

    //updateメソッドを乗っ取って,画面クリアを防ぐ
    public void update(Graphics g){
        paint(g);
    }
  }
}



TOPプログラマ専用Javaアプリケーション