【问题标题】:Delphi isn't writing my file header properlyDelphi 没有正确写入我的文件头
【发布时间】:2012-10-24 07:09:01
【问题描述】:

我认为与其将 TImage 与 8 位 BMP 一起使用,不如保存我自己的位图 - 我之前曾多次使用 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;

我什至尝试将其更改为 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 进行编辑。

【问题讨论】:

  • 为什么不直接使用 Windows 中已经定义的类型,比如 TBitmapFileHeader 和 TBitmapInfoHeader?然后,它们将具有正确的结构,并且字段名称将与其他人所知道的名称相匹配,因此您将能够更好地交流它们。

标签: delphi file-io bitmap


【解决方案1】:

使用packed record 避免默认内存对齐。

【讨论】:

    【解决方案2】:

    在记录中添加packed关键字,表示其内容不应该对齐:

    BitmapH = packed Record
    

    【讨论】:

      猜你喜欢
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-02
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 2020-05-10
      相关资源
      最近更新 更多