高分相送 如何读出包含图和属性的文件中的bmp图 难难(300分)

  • 主题发起人 主题发起人 chyn.1
  • 开始时间 开始时间
C

chyn.1

Unregistered / Unconfirmed
GUEST, unregistred user!

有一文件其格式如下:
字节
20 “PF1.0”
4 裁片数目(long)
4 Bmp字节数(int)
10840 Bmp数据 重复裁片数目次
236 裁片数据
其中 “Bmp字节数(int)、Bmp数据、裁片数据” 重复裁片数目次
“Bmp数据”是不包含bmp文件头的bmp数据,只包含bmp位图数据头和
位图数据(真彩色)
“裁片数据”是bmp图的属性信息

请教各位:如何将bmp读出并显示。
因为此文件是用vc++创建的,他们在编程时是通过vc++的diblook例程实现显示的,
但我在delphi中如何实现。




 
用流文件,但头指针移到Bmp数据开始的地址,按Bmp字节数读出bmp数据,
在把这个流Assign到一个TBitmap上显示即可。
 
ver 2.0
用流文件,但头指针移到Bmp数据开始的地址,读到文件尾,读出bmp图像数据,
在把这个流Assign到一个TBitmap上显示即可。
 
创建一个文件,构造一个bmp文件头,依次把bmp图数据写进出。然后再读出来
 
to 杜宝 and sonie 请说的详细一点,最好能附一段代码
 
此问题,我已解决,将其贴在此,以供参考


var
FFileHeader : TBitmapFileHeader;
FInfoHeader : TBitmapInfoHeader;
FInfo : TBitmapInfo;
TempStream : TMemoryStream;
VPi_PieFile :file;
buf:array[1..10840] of byte;
VPi_CutNum:longint; //裁片数目
VPi_BmpByteNum,offset: longint; //bmp字节数
i:integer;
begin
assignfile(VPi_PieFile,'e:/work/filename.pie');
reset(VPi_PieFile,1);

seek(VPi_PieFile,20); //读取裁片数目
blockread(VPi_PieFile,VPi_CutNum,4);

seek(VPi_PieFile,24); //读取bmp字节数
blockread(VPi_PieFile,VPi_BmpByteNum,4);

i:=strtoint(edit1.text);
if i< VPi_CutNum+1 then
begin

//建立Bitmap 文件头
offset:=28+VPi_BmpByteNum*(i-1)+236*(i-1)+4*(i-1);
canvas.textout(0,20,'这是文件111.pie的第 '+inttostr(i)+' 个裁片数据');
with FFileHeader do
begin
bfType := $4D42;
bfSize := 10840; //大小固定
bfReserved1 := 0; //保留字
bfReserved2 := 0; //保留字
bfOffBits := SizeOf(TBitmapFileHeader)+SizeOf(TBitmapInfoHeader); //位图数据偏移量
end;

//建立Bitmap 位图数据头
with FInfoHeader do
begin
biSize := 40; //位图数据头的长度 固定的
//biSize := SizeOf(TBitmapInfoHeader); //位图数据头的长度
biWidth := 60; //图像宽
biHeight := 60; //图像高
biPlanes := 1; //输出设备的位平面数,必须为1
biBitCount := 24; //24位真彩色
biCompression := BI_RGB; //压缩类型 BI_RGB????
biSizeImage := 60* 60 * 3; //图像文件的字节数
end;

seek(VPi_PieFile,offset);
blockread(VPi_PieFile,buf,sizeof(buf));

TempStream := TMemoryStream.Create;
TempStream.Write(FFileHeader,sizeof(FFileHeader));


TempStream.seek(0,soFromEnd);
TempStream.Write(Buf,sizeof(buf));

TempStream.Position := 0;

TempStream.savetofile('e:/work/test'+inttostr(i)+'.bmp');

TempStream.Free;
end
else
begin
showmessage('i太大,重输入<'+inttostr(VPi_CutNum));
end;
closefile(VPi_PieFile);





end;

end.
 
多人接受答案了。
 
后退
顶部