8ビットBMPでTImageを使用する代わりに、自分のビットマップを保存することを考えました。これは、以前にDelphiで数回行ったことがあります。しかし、どういうわけか私には理解できません。ファイルの最初の2バイトは常に4バイトとして書き込まれます。ヘッダーの私の記録は
type
BitmapH = Record
head : WORD;
filesize : DWORD;
reserved : DWORD;
bmpoffset : DWORD;
bmpheadersize : DWORD;
width : DWORD;
height : DWORD;
planes : WORD;
bpp : word;
comp : longint;
bmdatasize : longint;
hres : longint;
vres : longint;
numofcolors : longint;
importantcolors : longint;
palette : array[0..1023] of byte;
end;
私はそれを2バイトの配列に変更することさえ試みましたが、それでもうまくいきません。それでもhead:byte;に変更されました。それでも1バイトを書き込んでから、ジャンクを次の3バイトにプッシュします。単純なものが欠落しているに違いありません。
これが私がファイルヘッダーを書いている方法です-
var BM : file of BitmapH;
var BMD : file of byte;
var header : BitmapH;
var i : integer;
var test : byte;
begin
AssignFile(BM, 'd:\test.bmp');
Rewrite(BM);
header.head := 19778;
// header.head[1] := 'M';
header.filesize := 2102;
header.reserved := 0;
header.bmpoffset := 1080;
header.bmpheadersize := 40;
header.width := 32;
header.height := 32;
header.planes := 1;
header.bpp := 8;
header.comp := 0;
header.bmdatasize := 1024;
header.hres := 100;
header.vres := 100;
header.numofcolors := 0;
header.importantcolors := 0;
for i := 0 to 255 do
begin
header.palette[i*4] := getBvalue(palette[i]);
header.palette[(i*4) + 1] := getBvalue(palette[i]);
header.palette[(i*4) + 2] := getBvalue(palette[i]);
header.palette[(i*4) + 3] := 0;
end;
Write(BM, header);
粗雑で申し訳ありませんが、それは単なるテストです:)
どんな助けでも大歓迎です!
PS-保存にTImageを使用しない理由は、パレットをその場で変更しているためです。これは、TImageを介して編集するのが面倒なようです。