快速显示大(几个G)BMP 的有一个//从指定的文件中读取一块图像 位置在 Px,Py(左下角坐标) 宽度 高度 由 ABMP 确定 Procedure ReadBMPData(BMPFile:String; ABMP:TBitMap; Px,Py:LongInt); Var AFile:File Of Byte; FileHead:TBITMAPFILEHEADER; InfoHead:TBITMAPINFOHEADER; BytesPerLine:LongInt; Bw,Bh:Integer; //源图像大小 W,H:Integer; //目标图像大小 X1,Y1,X2,Y2:Integer; //复制区域 I:Integer; Begin If ABMP=Nil Then Exit; If Not FileExists(BMPFile) Then Exit; {$I-} AssignFile(AFile,BMPFile); FileMode := 0; Reset(AFile); BlockRead(AFile,FileHead,SizeOf(TBITMAPFILEHEADER)); BlockRead(AFile,InfoHead,SizeOf(TBITMAPINFOHEADER)); If ((InfoHead.biBitCount<>24) OR (InfoHead.biCompression<>0)) Then Begin //必须是 24 位 非压缩文件格式 CloseFile(AFile); Exit; End; //每条扫描线数据长度 BytesPerLine:=(InfoHead.biWidth* InfoHead.biBitCount+31) Div 8; BytesPerLine:=(BytesPerLine Div 4)*4; //目标相关信息 Bw:=InfoHead.biWidth; Bh:=InfoHead.biHeight; W:=ABmp.Width; H:=ABmp.Height; //坐标变换 X1:=Px; If X1<0 Then X1:=0 Else If X1>Bw-1 Then X1:=Bw-1; Y1:=Py; If Y1<0 Then Y1:=0 Else If Y1>Bh-1 Then Y1:=Bh-1; X2:=Px+W-1; If X2<0 Then X2:=0 Else If X2>Bw-1 Then X2:=Bw-1; Y2:=Py+H-1; If Y2<0 Then Y2:=0 Else If Y2>Bh-1 Then Y2:=Bh-1; //读取数据到 BMP 对象 For I:=Y1 To Y2 Do Begin Seek(AFile,FileHead.bfOffBits+I*BytesPerLine+X1*3); BlockRead(AFile,ABMP.ScanLine[(H-1)-(I-Y1)]^,(X2-X1)*3); End; CloseFile(AFile); {$I+} End;
Procedure ReadBMPData(BMPFile:String; ABMP:TBitMap; Px,Py:LongInt);
Var AFile:File Of Byte;
FileHead:TBITMAPFILEHEADER;
InfoHead:TBITMAPINFOHEADER;
BytesPerLine:LongInt; Bw,Bh:Integer; //源图像大小
W,H:Integer; //目标图像大小
X1,Y1,X2,Y2:Integer; //复制区域 I:Integer;
Begin
If ABMP=Nil Then Exit;
If Not FileExists(BMPFile) Then Exit; {$I-}
AssignFile(AFile,BMPFile);
FileMode := 0;
Reset(AFile); BlockRead(AFile,FileHead,SizeOf(TBITMAPFILEHEADER));
BlockRead(AFile,InfoHead,SizeOf(TBITMAPINFOHEADER));
If ((InfoHead.biBitCount<>24) OR (InfoHead.biCompression<>0)) Then
Begin
//必须是 24 位 非压缩文件格式
CloseFile(AFile);
Exit;
End; //每条扫描线数据长度
BytesPerLine:=(InfoHead.biWidth* InfoHead.biBitCount+31) Div 8;
BytesPerLine:=(BytesPerLine Div 4)*4; //目标相关信息
Bw:=InfoHead.biWidth; Bh:=InfoHead.biHeight;
W:=ABmp.Width; H:=ABmp.Height; //坐标变换
X1:=Px; If X1<0 Then X1:=0 Else If X1>Bw-1 Then X1:=Bw-1;
Y1:=Py; If Y1<0 Then Y1:=0 Else If Y1>Bh-1 Then Y1:=Bh-1;
X2:=Px+W-1; If X2<0 Then X2:=0 Else If X2>Bw-1 Then X2:=Bw-1;
Y2:=Py+H-1; If Y2<0 Then Y2:=0 Else If Y2>Bh-1 Then Y2:=Bh-1; //读取数据到 BMP 对象
For I:=Y1 To Y2 Do
Begin
Seek(AFile,FileHead.bfOffBits+I*BytesPerLine+X1*3);
BlockRead(AFile,ABMP.ScanLine[(H-1)-(I-Y1)]^,(X2-X1)*3);
End; CloseFile(AFile);
{$I+}
End;