1

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を介して編集するのが面倒なようです。

4

2 に答える 2

8

packed recordデフォルトのメモリ アラインメントを回避するために使用します。

于 2012-10-24T07:11:32.847 に答える
3

パックされたキーワードを record に追加して、コンテンツが整列されるべきではないことを示します。

BitmapH = packed Record
于 2012-10-24T07:12:16.740 に答える