如何读取一个bmp文件的信息?(50分)

  • 主题发起人 主题发起人 starflying
  • 开始时间 开始时间
S

starflying

Unregistered / Unconfirmed
GUEST, unregistred user!
请教各位高手,如何读取一个bmp文件的信息:BITMAPFILEHEADER,BITMAPINFOHEADER和图象数据信息?我用下面的代码不成功,问题出在那里?

如果要把图象数据的前面插入一个记录信息,并保存到Olevariant中该如何处理?

function GetData(InBitmap : TBitmap; var RetData : OleVariant) : integer;
var
BmpMmStream,DenMmStream: TMemoryStream;
BmpFileHead : BITMAPFILEHEADER;
BmpInfoHead : BITMAPINFOHEADER;
BmpRgbD : RGBQUAD;
begin
Result := 0;
BmpMmStream := TMemoryStream.Create;
InBitmap.SaveToStream(BmpMmStream);
BmpMmStream.Read(BmpFileHead,sizeof(BITMAPFILEHEADER));
BmpMmStream.Read(BmpInfoHead,sizeof(BITMAPINFOHEADER));
BmpMmStream.Read(BmpRgbD,sizeof(RGBQUAD));
end
 
//BmpMmStream.Position:= 0;
//BmpMmStream.Position:= 0;
 
是何用意...
 
function GetData(InBitmap : TBitmap; var RetData : OleVariant) : integer;
var
Stream: TMemoryStream;
P: Pointer;
begin
Result := 0;
Stream:= TMemoryStream.Create;
try
InBitmap.SaveToStream(Stream);
Stream.Size := Stream.Size + SizeOf(你的记录);
System.Move(Pointer(LongInt(Stream.Memory))^, Pointer(LongInt(Stream.Memory)+SizeOf(你的记录))^, Stream.Size - SizeOf(你的记录));
Stream.Position := 0;
Stream.WriteBuffer(你的记录, SizeOf(你的记录));
RetData := VarArrayCreate([0, Stream.Size-1], varByte);
P := VarArrayLock(RetData);
try
System.Move(Stream.Memory^, P^, Stream.Size);
finally
VarArrayUnLock(P);
end;
finally
Stream.Free;
end;
end;
试试吧,不行告诉我。
 
谢谢superatom,我马上试试,还想问一下:
对于那个读取图象的信息的问题:
我把图象转换为256色灰度后,会改变图象头等信息嘛?我重新读取图象信息,怎么发现biBitCount还是32,不是说256色的应该是8嘛?代码如下:
//非黑白图象,则转换成黑白图象
if BmpInfoHead.biBitCount <> 1 then
begin
for iRow := 0 to BmpInfoHead.biHeight - 1 do
begin
p := InBitmap.ScanLine[iRow];
for iCol := 0 to BmpInfoHead.biWidth - 1 do
begin
nGay := Round(0.299*p[iCol*3+2] + 0.587*p[iCol*3+1] + 0.114*p[iCol*3]);
p[iCol*3+2] := nGay;
p[iCol*3+1] := nGay;
p[iCol*3] := nGay;
end;
end;
end;
分可以再加,谢谢了,各位xdjm请帮忙
 
后退
顶部