我写了两个保存DIB->Bitmap的函数,两个都能实现将DIB内容放入Bitmap中,不过在处理的时候都有些慢,而且第一个还容易出现存储空间不够的问题,请各位看下有什么问题:
procedure TVideoCard.SaveDIBToBmp(PtBitmapInfoHeader: PBITMAPINFOHEADER; LpDIB:
LPSTR; Bitmap: TBitmap);
var
LpBitmapInfo: PBitmapInfo;
begin
if (Bitmap = nil) or (PtBitmapInfoHeader = nil) or (LpDIB = nil) then
Exit;
Bitmap.Width := PtBitmapInfoHeader.biWidth;
Bitmap.Height := PtBitmapInfoHeader.biHeight;
// NumberOfColors := PtBitmapInfoHeader.biClrUsed;
// BitCount := PtBitmapInfoHeader.biBitCount;
LpBitmapInfo := PBitmapInfo(PtBitmapInfoHeader);
StretchDIBits(Bitmap.Canvas.Handle, 0, 0, Bitmap.Width, Bitmap.Height, 0, 0,
Bitmap.Width, Bitmap.Height, LpDIB, LpBitmapInfo^, DIB_RGB_COLORS, SRCCOPY);
Assert(Bitmap.HandleType = bmDDB);
end;
procedure TVideoCard.SaveDIBToBmp1(PtBitmapInfoHeader: PBITMAPINFOHEADER;
LpDIB: LPSTR; Bitmap: TBitmap);
var
LpBitmapInfo: PBitmapInfo;
dcPic: HDC;
hbm: HBitmap;
begin
if (Bitmap = nil) or (PtBitmapInfoHeader = nil) or (LpDIB = nil) then
Exit;
dcPic := GetDC(0);
hbm := CreateDIBitmap(dcPic, PtBitmapInfoHeader^,
LongInt(CBM_INIT),
LpDIB,
(PBitmapInfo(PtBitmapInfoHeader))^,
DIB_RGB_COLORS);
Bitmap.ReleaseHandle;
Bitmap.Handle := hbm;
ReleaseDC(0, dcPic);
end;