激凹みから立ち直る方法

ビットマップがDATやDLLで1つにまとめられているものをよく見掛けるのですが、あれはどのような方法でやるのでしょうか?

どなたか教えて下さい。

A 回答 (1件)

★アドバイス


・『DLL』の場合はビットマップデータのみのリソースを単純に DLL 化しているだけ。
・『DAT』の場合は多分、独自にビットマップデータをアーカイブ(まとめる)しているのでは。
 『DAT』はソフトによって『データ』ならその拡張子をつけますので独自に1つに
 まとめているだけだと思います。
・イメージ的には
 総ヘッダ情報(ビットマップデータの個数など)
 サブヘッダ情報(ファイル名、ファイルサイズなど)、1つ目のビットマップデータ
 サブヘッダ情報(ファイル名、ファイルサイズなど)、2つ目のビットマップデータ
 サブヘッダ情報(ファイル名、ファイルサイズなど)、3つ目のビットマップデータ
  :
 サブヘッダ情報(ファイル名、ファイルサイズなど)、n個目のビットマップデータ
 とこんな感じで1つのデータファイルに出来ます。
・DLL 化すればリソースを読み込む関数群(LoadBitmp、LoadImage)などで簡単に利用できます。
 独自のデータファイルでパックした場合は、
 (1)総ヘッダ情報より、ビットマップデータの個数などを取得
 (2)サブヘッダ情報より、ビットマップデータのファイル名を頼りに Bitmap 形式を読み込む
 (3)指定のファイル名が見つからないとき、NULL を返す。
 ※こんな感じの独自関数群を用意します。

作り方:
typedef struct bmpdata_t {
 char filename[ MAX_PATH ]; ←bmpファイル名
 long size; ←bmpのサイズか、ファイルサイズなど
 long x; ←bmpの横幅
 long y; ←bmpの高さ
} bmpdata_t;

bmpdata_t bmp;
long lCount = 10; ←10個

fwrite( &lCount, sizeof(long), 1, fp ); ←総ヘッダ情報の出力
strcpy( bmp.filename, "Sample1.bmp" );
bmp.size = ファイルサイズなど;
bmp.x = xxxx;
bmp.y = yyyy;
fwrite( &bmp, sizeof(bmpdata_t), 1, fp ); ←サブヘッダ情報の出力(No.1)
MyFileCopy( bmp.filename, fp );

strcpy( bmp.filename, "Sample2.bmp" );
bmp.size = ファイルサイズなど;
bmp.x = xxxx;
bmp.y = yyyy;
fwrite( &bmp, sizeof(bmpdata_t), 1, fp ); ←サブヘッダ情報の出力(No.2)
MyFileCopy( bmp.filename, fp );
 :
strcpy( bmp.filename, "Sample10.bmp" );
bmp.size = ファイルサイズなど;
bmp.x = xxxx;
bmp.y = yyyy;
fwrite( &bmp, sizeof(bmpdata_t), 1, fp ); ←サブヘッダ情報の出力(No.10)
MyFileCopy( bmp.filename, fp );

その他:
・上記の簡単なプログラムで複数のビットマップデータ(ファイル)を1つにパックできると思います。
 bmpdata_t 構造体を独自に定義しておきます。
 今回は説明の都合上、ファイル名、サイズ、横幅、高さの4つをサブヘッダ情報としています。
 必要ならば他の要素を増やしたりして下さい。
・あと MyFileCopy() 関数は指定のファイル名を fp のファイルに単純にコピーする自作関数です。
 ファイル名を fopen して単純に fgetc → fputc などでコピーすればよい。あるいは fread、fwrite で。
・読み込むときは最初にサブヘッダ情報の数を long 型で取得します。
 その後、サブヘッダ情報の bmpdata_t 構造体を読み込み、ファイル名、サイズから1つずつ
 Bitmap 形式のファイルを読み込んでいく。読み込む関数は当然、独自に作成することとなる。
・以上。おわり。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!