メモリイメージ


ピクセルからイメージを生成する

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(不透明)です




前のページへ戻る次のページへ