S-JIS[2004-03-14/2004-03-16] 変更履歴
ひしだま作のJava用ビットマップ操作クラスです。(VC++で言うところのDIB)
JDK1.5は標準でビットマップを扱えます。→ImageIO
効率は重視していないので速度は遅いですが、すごく大きなビットマップでもファイルのまま扱えるのが特徴です。
コピー、塗り潰し、線を引くといった単純な操作も行えます。
(例えば4096×3072のビットマップに線を引くのに使いました。というか、これに線を引く為に作った)
ビットマップクラス(51.7kB)
| クラス | メソッド | 概要 |
|---|---|---|
| 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);
}
}