Delphi没有正确编写我的文件头

Met*_*tre 1 delphi file-io bitmap

我认为不是使用带有8位BMP的TImage而是保存我自己的Bitmap - 我之前已经用Delphi做了几次.但由于某些原因我无法弄清楚,文件的前两个字节总是写为四个字节!我的标题记录是

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;
Run Code Online (Sandbox Code Playgroud)

我已经尝试过将其更改为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);
Run Code Online (Sandbox Code Playgroud)

抱歉粗暴,这只是一个测试:)

任何帮助表示赞赏!

PS - 不使用TImage进行保存的原因是因为我正在动态更改调色板,这似乎是通过TImage进行编辑的麻烦.

Ond*_*lle 8

使用packed record以避免默认的内存对齐.