Например: Код | function HBitmapToCanvas(Source:HBitmap;Canvas:TCanvas;AlphaClr:TColorRef;var Rec:TRect):boolean; var bmInfo:BITMAPINFO; W,H:Integer; X,Y,i:Integer; bmDIB:HBitmap; tColor:TColorRef; MemBits:PRGBTriple; begin Result:=false; if Source=0 then exit; GetObject(Source,SizeOf(bmInfo),@bmInfo); W:=bmInfo.bmiHeader.biWidth; H:=bmInfo.bmiHeader.biHeight; if (W=0)and(H=0) then exit; Rec:=Rect(0,0,W,H); i:=(W*3)-((W*3) div 4)*4; if i<>0 then i:=4-i; bmInfo.bmiHeader.biWidth:=W; bmInfo.bmiHeader.biHeight:=H; bmInfo.bmiHeader.biPlanes:=1; bmInfo.bmiHeader.biBitCount:=24; bmInfo.bmiHeader.biCompression:=BI_RGB; bmInfo.bmiHeader.biSizeImage:=0; bmInfo.bmiHeader.biXPelsPerMeter:=2834; bmInfo.bmiHeader.biYPelsPerMeter:=2834; bmInfo.bmiHeader.biClrUsed:=0; bmInfo.bmiHeader.biClrImportant:=0; bmInfo.bmiHeader.biSize:=SizeOf(bmInfo.bmiHeader); bmDIB:=CreateDIBSection(Canvas.Handle,bmInfo,DIB_RGB_COLORS,Pointer(MemBits),0,0); bmInfo.bmiHeader.biWidth:=W; bmInfo.bmiHeader.biHeight:=H; bmInfo.bmiHeader.biPlanes:=1; bmInfo.bmiHeader.biBitCount:=24; bmInfo.bmiHeader.biCompression:=BI_RGB; bmInfo.bmiHeader.biSize:=SizeOf(bmInfo.bmiHeader); GetDIBits(Canvas.Handle,Source,0,H-1,MemBits,bmInfo,DIB_RGB_COLORS); Y:=H; repeat dec(Y); X:=0; while X<W do begin tColor:=RGB(MemBits.rgbtRed,MemBits.rgbtGreen,MemBits.rgbtBlue); if (tColor<>AlphaClr) then Canvas.Pixels[X,Y]:=tColor; Inc(MemBits); inc(X); end; PChar(MemBits):=PChar(MemBits)+I; until (Y=0); DeleteObject(bmDIB); Result:=true; end; | |