メモリイメージ
ピクセルからイメージを生成する
GraphicsクラスとColorクラスを用いて、ある程度のアニメーションを表現することはできます
しかし、高度な色のグラデーションによるロゴアニメーションなどは
この方法を用いた場合、かなり面倒な操作になるでしょう
そこで、メモリイメージソースという技術を用います
Java のグラフィックス API では数値配列から画像を生成することができます
数値配列は、ピクセルの色情報を表しています
イメージの生成には、やはりイメージプロデューサを生成してcreateImage()メソッドに渡します
今回、イメージプロデューサを生成するのはjava.awt.image.MemoryImageSourceクラスです
このクラスはImageProducerインターフェイスをインプリメントしています
このクラスのコンストラクタは次のものがあります
public MemoryImageSource( int w, int h, ColorModel cm, byte pix[], int off, int scan )
public MemoryImageSource( int w, int h, ColorModel cm, byte pix[], int off, int scan, Hashtable props )
public MemoryImageSource( int w, int h, ColorModel cm, int pix[], int off, int scan )
public MemoryImageSource( int w, int h, ColorModel cm, int pix[], int off, int scan, Hashtable props )
public MemoryImageSource( int w, int h, int pix[], int off, int scan )
wには横幅、hには縦幅を指定します
ColorModelは今回使いません。カラーモデルについては次章で詳しく説明します
また、Hashtableをこのコンストラクタで使用することはまずないと思うので、この場では説明しません
pix[]には、ピクセルの色の生成に用いる配列を指定します
int型のこの配列は、1要素アルファ値と赤、緑、青の各色をそれぞれ8ビットずつで表現します
配列数は、ピクセル数 w * h で構成されます
配列を画像に展開するときは、w要素数までくると1ピクセル下がって展開されます
つまり、左から右へ、上から下へと展開されます
offは配列のオフセットを(通常は0)
scanは、ピクセルのある行から配列の次の行までのサイズを指定します
ここで指定するサイズは、指定した横サイズと同じピクセル配列を用いる場合
指定した横幅と同じ値を指定します(つまり、通常は w で指定する値と同じ値でよい)
このオブジェクトをcreateImage()メソッドでImageオブジェクトに変換します
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
/* <applet code="App51.class" width="300"height="300">
</applet>
*/
public class App51 extends Applet {
Image img;
public void init() {
int ary[] = new int[300 * 300] , index = 0;
for (int i = 0 ; i < 300 ; i++) {
int r = (i * 255) / 299;
for (int j = 0 ; j < 300 ; j++)
ary[index++] = ( 255 << 24 ) | ( r << 16 ) | (( j * 255 ) / 299) << 8;
}
MemoryImageSource m = new MemoryImageSource(300 , 300 , ary , 0 , 300);
img = createImage(m);
}
public void paint(Graphics g) {
g.drawImage(img , 0 , 0 , 300 , 300 , this);
}
}
左上が黒(255 , 0 , 0 , 0)、右に行くほど緑値が強くなり
下に行くほど赤値が強くなります
アルファ値(透明度)は常に255(不透明)です