2012-10-24 57 views
1

我認爲,而不是使用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進行編輯的麻煩。

+1

爲什麼不直接使用Windows已經定義的類型,如TBitmapFileHeader和TBitmapInfoHeader?然後,他們將擁有正確的結構,並且字段名稱將與其他人都瞭解的字段匹配,因此您可以更好地進行溝通。 –

回答

3

添加包裝關鍵字記錄,以表明它的內容不應該對齊:

BitmapH = packed Record