S-JIS[2004-03-14/2004-03-16] 変更履歴

ビットマップクラス

ひしだま作のJava用ビットマップ操作クラスです。(VC++で言うところのDIB
JDK1.5は標準でビットマップを扱えます。→ImageIO

効率は重視していないので速度は遅いですが、すごく大きなビットマップでもファイルのまま扱えるのが特徴です。

コピー、塗り潰し、線を引くといった単純な操作も行えます。
(例えば4096×3072のビットマップに線を引くのに使いました。というか、これに線を引く為に作った

ビットマップクラス(51.7kB)

主な使い方(詳細(?)はJavadoc参照)
クラス メソッド 概要
Bitmap   ビットマップを扱う為のインターフェース。
set(x,y,c) ドットに色をセットする。
get(x,y) ドットの色を取得する。
fill() 範囲を塗り潰す。
line() 線を引く。
copy() 別のビットマップから範囲をコピーする。
PaletteBitmap   16色、256色ビットマップの為のインターフェース。Bitmapを継承している。
FileBitmap   画像データをメモリーに読み込まずに、直接ファイル内部を操作するビットマップのインターフェース。Bitmapを継承している。
BitmapFactory createMemeryBitmap() メモリー上で操作するビットマップを新規作成する。
loadMemoryBitmap() メモリー上で操作するビットマップをファイルから読み込む。
createFileBitmap() ファイル上で操作するビットマップを新規作成する(ファイルも新規作成する)。
openFileBitmap() ファイル上で操作するビットマップをオープンする。
BitmapFileHeader   ビットマップファイルのヘッダー。VC++のBITMAPFILEHADERに該当。
BitmapInfoHeader   ビットマップ情報のヘッダー。VC++のBITMAPINFOHEADERに該当。
BitmapInfoColors   パレット群。VC++のBITMAPINFOのbmiColorsに該当。

eclipseで簡単にJavadocが作れるので、ついJavadoc作っちゃいました。 なんか、かっこいい〜ちょっと感動(笑)


ビットマップクラスの使用例

/*
 * 作成日: 2004/03/14
 */
package ds4;

import jp.hishidama.bitmap.Bitmap;
import jp.hishidama.bitmap.BitmapFactory;
import jp.hishidama.bitmap.BitmapInfoColors;
import jp.hishidama.bitmap.FileBitmap;
import jp.hishidama.bitmap.MemoryBitmap24;

/**
 * セリナ姫の肖像の線を引く
 * @author ひしだま
 */
public class Ds4Warp {

	static String pathName;

	public static void main(String[] args){
		Ds4Warp.pathName=args[0];
		FileBitmap map=BitmapFactory.openFileBitmap(pathName,"ds4warp1.bmp");

		warp(map, 0,3,52,2, 10,2, 5, 6, 1);
		warp(map, 1,1,45,1,  3,3,42, 8, 4);
		warp(map, 2,0,31,3,  5,1,34,10, 1);
		warp(map, 2,1,36,3, 12,3,32, 1, 1);
		warp(map, 2,2, 8,3,  9,0, 1, 7, 4);
		warp(map, 3,3,41,6, 13,0,53, 8, 4);
		warp(map, 4,3,43,7, 14,3,46, 7, 4);
		warp(map, 5,1, 1,9,  9,1, 4,10, 2);
		warp(map, 5,1, 3,1,  9,1, 4,10, 2);
		warp(map, 5,1,61,1,  9,1, 4,10, 2);
		warp(map, 5,1,61,9,  9,1, 4,10, 2);
		warp(map, 6,2,57,3,  3,3,40, 3, 4);
		warp(map, 7,1,61,1,  3,3,40, 8, 4);
		warp(map, 8,3,43,7,  3,3,42, 3, 1);
		warp(map, 9,1, 5,9,  5,1,30,10, 2);
		warp(map, 9,3,31,5, 13,2,62,10, 4);
		warp(map,11,0,23,8,  1,1,56, 1, 4);
		warp(map,13,0,59,5, 15,1,42, 7, 1);
		warp(map,13,1,43,8, 11,1,58, 2, 1);
		warp(map,13,2,38,8,  2,1,59, 9, 4);
		warp(map,14,3,28,8, 14,3, 7, 3, 4);
		warp(map,15,1,42,2,  7,1,61, 2, 1);
		warp(map,15,3,24,2, 11,0,57, 3, 4);

		map.close();
	}

	static final int RED  =BitmapInfoColors.getRGB(255,0,0);
	static final int GREEN=BitmapInfoColors.getRGB(0,255,0);
	static final int BLUE =BitmapInfoColors.getRGB(0,0,255);
	static final int WHITE=BitmapInfoColors.getRGB(255,255,255);

	private static void warp(Bitmap map,int mapsy,int mapsx,int sx,int sy,int mapdy,int mapdx,int dx,int dy,int cnt){
		sx+=mapsx*64;sx*=16;
		sy+=mapsy*12;sy*=16;
		dx+=mapdx*64;dx*=16;
		dy+=mapdy*12;dy*=16;

/*		Bitmap tst=new MemoryBitmap24(16,16);
		tst.copy(0,0,16,16,map,sx,sy);
		tst.save(pathName,"serina"+mapsy+"_"+mapsx+".bmp");
/**/
		
		if(sx<dx) sx+=15;
		if(sy<dy) sy+=15;
		dx+=8;dy+=8;

		int c;	//色コード
		switch(cnt){
			case 1:	c=GREEN;break;
			case 2:	c=RED;break;
			case 3:	c=BLUE;break;
			default:	c=WHITE;break;
		}
		map.line(sx,sy,dx-sx,dy-sy,c);
	}

}

自作ソフトへ戻る / 技術メモへ行く
メールの送信先:ひしだま