Bitmapを使ってみる

携帯用のMIDPやiアプリ、あるいはJava2SEでは画像やプログラムによる描画結果を保持する画像オブジェクト用クラスとしてImageクラスが用意されていました。jpgやgif、pngといった画像ファイルをImage(やそのサブクラスのオブジェクト)に読み込んだり、任意の大きさのImageを作成してGraphicsで各種の描画処理を行う形でグラフィック処理を行っていたわけです。

Androidでは、標準的なJavaのImageの代わりにBitmap(android.graphics.Bitmap)クラスが用意されています。AndroidのBitmapも、画像リソースやフレームバッファからオブジェクトを作成したり、任意の大きさで作成したBitmapにプログラムで描画を行うことができます。

Bitmapの作成は、Btimapクラスのコンストラクタではなく静的メソッドcreateBitmap()を呼び出して行います。この時、画像の色形式も指定しますが、通常のAndroid端末で実行するアプリ開発なら、特に理由がなければRGBA各8ビット(1ピクセル32ビット)となるBitmap.Config.ARGB_8888を指定することになるでしょう。
createBitmap()には、任意の大きさで新規のビットマップを作成する、指定の配列をフレームバッファ(ピクセル列データ)として読み込んでビットマップを作成する、pngやjpgなどの画像ファイルのデータから描画用画像を生成する、などいくつかの機能がオーバーロードされています。

作成したBitmapに描画を行う場合は、Bitmapを保持するCanvasオブジェクトを作成して、Canvasの機能を通して描画処理を行います。

たとえば、64*64ピクセルのBitmapを作成してそれにCanvasで塗りつぶし長方形を描画するViewから成るAndroidアプリなら、以下のような感じです。

Viewクラス

import android.content.Context;
import android.view.View;
import 	android.graphics.Canvas;
import 	android.graphics.Paint;
import 	android.graphics.Bitmap;

public class BitmapTestView extends View {

	private Bitmap bmp;
	
	public BitmapTestView(Context context) {

		super(context);

		// 64*64ピクセルのBitmap作成
		bmp = Bitmap.createBitmap(64, 64, Bitmap.Config.ARGB_8888);

		// bmpを描画対象として保持するCanvasを作成
		Canvas cv = new Canvas(bmp);

		Paint p = new Paint();

		// 塗りつぶし色として紫を指定
		p.setColor(0xffff00ff);

		// Canvasを通してbmpの左半分に塗りつぶし描画
		cv.drawRect(0, 0, 32, 64, p);

		// 塗りつぶし色として黄色を指定
		p.setColor(0xffffff00);

		// Canvasを通してbmpの右半分に塗りつぶし描画
		cv.drawRect(32, 0, 64, 64, p);

	}

	@Override
	protected void onDraw(Canvas cv) {

		cv.drawBitmap(bmp, 0, 0, null);

	}

}

Activityクラス

import android.app.Activity;
import android.os.Bundle;

public class BitmapTestActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

    	super.onCreate(savedInstanceState);

    	setContentView(new BitmapTestView(this));

    }

}

Bitmapを使うと、画像や描画結果をメモリ上に「保存」しておくことができるので、効率的なグラフィック処理ができるようになりますね。ただし、Androidではメモリが圧迫されるとアプリが強制終了されるなどの問題が生じやすくなるので、大きなBitmapを確保する際は効率的な利用を心がけましょう。


創作プログラミングの街