我認爲,而不是使用8位BMP的TImage,我會保存我自己的位圖 - 這是我以前用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字節數組仍然沒有去。即使它變成只是頭:字節;它仍然寫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?然後,他們將擁有正確的結構,並且字段名稱將與其他人都瞭解的字段匹配,因此您可以更好地進行溝通。 –