配列からイメージを作る

 多くのシステムでは、グラフィックを扱うための「ビットマップ」が用意されています。これは、グラフィックを色の情報を集めた配列のような感じで扱うためのもので、画面のある点に特定の色を付けたり、逆に今表示しているグラフィックのある点の色を調べたりする時には、非常に便利なものです。WindowsではDIBがこれに相当するわけですが、Javaにも色情報の配列からイメージを作ったり、イメージの色情報を配列に格納する仕組みが用意されています(DIBについてはこちらを参照)。
 まず、今回は配列からイメージを作るMemoryImageSourceクラスを使ってみました。

・色の表現形式と配列

 このクラスで使う配列は32ビット整数(int)型配列で、上位から順に透明度・赤・緑・青をそれぞれ8ビットで表しています。

31      24     16      8       0
透明度    赤       緑   青

 このうち、透明度は小さくなると透明になってくる、というものですが、今回は最大値(255)を使いましょう。赤・緑・青各成分を8ビット(0ー255)で表すのは、WindowsDIB(24ビットフルカラー)と同じですね。

 色の情報は、2次元ではなく1次元配列として記憶するので注意してください。1ドットが要素1つに対応し、全体の大きさは横幅×高さになります。格納される順序は左から右、上から下でDIB とは上下逆です。最も、こちらの方がグラフィックの座標としては普通なのですが。

MemoryImageSource の使い方

 色の情報を配列に格納したら、後はそれでMemoryImageSourceのオブジェクトを作ってイメージを作る事が出来ます。ただし実際には、このMemoryImageSourceオブジェクトを引数としてcreateImageメソッドを実行する必要があるので、createImage が直接実行できない環境では一度ToolKitなどのオブジェクトを作ってそれのcreateImageメソッドを呼び出す必要があります。まあ、アプレットの中では大丈夫ですが。

MemoryImageSource(int w,int h,int[] pix,int off,int scan)

 これがMemoryImageSource の代表的なコンストラクタです。w にはイメージの横幅を、hには高さを入れてpixで色の情報を格納した配列を指定します。offは、配列の全体ではなく一部でイメージを作成する時、どこからイメージを作るか、という開始座標を指定するものです。これは、何番目の要素から開始するかを指定するので、配列の横幅がawなら(最も、1次元配列だから「横幅」というのも変かな)、(x,y)を開始座標とする場合はx+aw*y を指定する事になります。そうすると、(x,y) から(x+w,y+h)の範囲でイメージが作成されるわけです。配列全体からイメージを作る時には、ここを0にしてw, h を配列の大きさと一致させます。
 最後のscan にはイメージの横幅を指定します。

・プログラム例

 では、実際にイメージを作ってみましょう。今回は64*64のランダムな色情報を配列に作り、その配列で作ったイメージを2倍に拡大して表示するようにしました。

 配列にランダムな色情報を入れるには、

  for (i=0;i<64;i++)
      for (j=0;j<64;j++) {

          r=Math.abs(rnd.nextInt() % 256);
          g=Math.abs(rnd.nextInt() % 256);
          b=Math.abs(rnd.nextInt() % 256);

          dot[j+i*64]=0xff000000+r*65536+g*256+b;

      }

 とします。これは、最上位の透明度を常に255(0xff)にして、後は赤・緑・青それぞれの成分をもとに色を作る、という意味です。そして、配列からイメージを作るには、

img=createImage(new MemoryImageSource(64,64,dot,0,64));

 とすればImage型変数imgにイメージが造られます。

 アプレット内でクリックするとイメージを作り直すので、何度かクリックしてみてましょう。

プログラムソース表示

戻る