如何读取打包的图片?(100分)

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

showton

Unregistered / Unconfirmed
GUEST, unregistred user!
假设有一图片包,已知第二个图片包的位置在位移500处,
如何写个函数读文件返回一个Tbitmap?
我试了好多方法,都没成功,请帮帮忙。。
 
就是能不能用二进制去读文件,读出一段,然后直接转换成BitBmp呢....
不要一次把这个图片包载入到内存里,也不要用临时文件,感谢大家。。
 
TBitmap有没有类似LoadFromStream之类的方法?不好意思我记不太清了,而且现在手下面也没有Delphi做实验。

如果有的话,用一个TFileStream和你的文件连接起来,把指针移到500,然后拷贝到一个新的Stream中,然后在LoadFormStream估计就可以了
代码:
function GetBitmap(Filename: String;Pos: int64): TBitmap;
var
  F: TFileStream;
  M: TMemoryStream;
  B: TBitmap;
begin
  F := TFileStream.Create(Filename); //我忘记怎么调用了,估计是这样子的
  F.Seek(Pos);
  M := TMemoryStream.Create;
  M.Read(); //这个也忘记了,自己看帮助吧,从F中读取你的Bmp
  M.Seek(0); //好像可有可无,不过写上没有坏处
  B := TBitmap.Create;
  B.LoadFromStream(M);
  FreeandNil(M);
  FreeandNil(F);
  Result := B;
  B := nil;
end;

大概就这样子了,好多东西我都不记得了,Delphi的IDE真是会把人变懒的,呵呵
 
这个方法我尝试过了,执行B.LoadFromStream(M);之后啥也读不进来。。
而且我的文件过大的话,F := TFileStream.Create(Filename);这句话就要执行很久。。。
所以我想找一种能不load文件进内存,直接读取文件一部分转换成Bitmap的方法。。
 
你有没有把M的位置指针设为0?
M.Seek(0);

直接读取??太底层了吧,呵呵,这个我还没研究过。不敢乱说的
 
就是直接读取,连流都不要用。。
 
把我的步骤详细的贴出来:
var FFileHeader : PBitmapFileHeader;//文件头信息
FInfoHeader : PBitmapInfoHeader;//bmp头信息
FInfo : PBitmapInfo; //bmp信息
MappedFile: THandle;//映像文件信息
hFile: THANDLE;
Fdata:Pointer;
FPixelStart :pointer;
Bitmap: HBitmap;//bmp句柄
buf:Pointer;
begin
//打开文件
hFile := CreateFile(pchar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

if ( hFile <> INVALID_HANDLE_VALUE ) then
begin
//创建一个映像文件
MappedFile := CreateFileMapping(hFile, nil, PAGE_READONLY, 0, 0, nil);
//得到映像文件指针
Fdata := MapViewOfFile(MappedFile, FILE_MAP_READ, 0, 0, 0);
//取得Bmp文件头信息
FFileHeader := FData;
//取得bmp信息
FInfoHeader := pointer (integer (FData) + sizeof (TBitmapFileHeader));
FInfo := pointer (FInfoHeader);
// 数据开始的指针位置
FPixelStart := pointer (integer(FData) + FFileHeader^.bfOffBits);

/////////////////重点在这里/////////////////////////////
//根据得到的BMP信息创建一个BitMap句柄
Bitmap:= CreateDIBSection(0, FInfo^, DIB_RGB_COLORS, buf, 0, 0);

//移动数据到buf指针,但总是报错。。。
move(FPixelStart,buf^,FInfo.bmiHeader.biSizeImage);
end;
//结束






 
我觉得TFileStream并不是把文件整个读入到内存中来,所以在Create的时候因该不会太长的时间.另外,用Loadfromstream之前最好把Stream的指针归0,否则可能出现无法读取.
我觉得用流可行.你说的方法我还不会,不好意思了.
 
后退
顶部