Mega Code Archive

 
Categories / Delphi / Graphic
 

How to handle bitmap layers

Title: How to handle bitmap layers? Question: I want overlay bitmap2 over bitmap. The bitmap2 should be on top of bitmap1, i.e. the end result should be that bitmap2 should also show bits of bitmap1. What is the best way in Delphi to handle this? Answer: There are two methods. One works using a TImageList the other without. So the latter will work with other file types besides BMP's. Here's the code for both, it's pretty clear how both work. The key thing is you must specify a transparent color: procedure DrawTrans(DestCanvas: TCanvas; X,Y: smallint; SrcBitmap: TBitmap; AColor: TColor); var ANDBitmap, ORBitmap: TBitmap; CM: TCopyMode; Src: TRect; begin ANDBitmap:= NIL; ORBitmap:= NIL; try ANDBitmap:= TBitmap.Create; ORBitmap:= TBitmap.Create; Src := Bounds(0,0, SrcBitmap.Width, SrcBitmap.Height); with ORBitmap do begin Width:= SrcBitmap.Width; Height:= SrcBitmap.Height; Canvas.Brush.Color := clBlack; Canvas.CopyMode := cmSrcCopy; Canvas.BrushCopy(Src, SrcBitmap, Src, AColor); end; with ANDBitmap do begin Width:= SrcBitmap.Width; Height:= SrcBitmap.Height; Canvas.Brush.Color := clWhite; Canvas.CopyMode := cmSrcInvert; Canvas.BrushCopy(Src, SrcBitmap, Src, AColor); end; with DestCanvas do begin CM := CopyMode; CopyMode := cmSrcAnd; Draw(X,Y, ANDBitmap); CopyMode := cmSrcPaint; Draw(X,Y, ORBitmap); CopyMode := CM; end; finally ANDBitmap.Free; ORBitmap.Free; end; end; The other way: abitmap:= tbitmap.Create; imagelist1.Clear; abitmap.LoadFromFile('1.bmp'); imagelist1.AddMasked(abitmap, clNone); abitmap.Empty; abitmap.LoadFromFile('e1.bmp'); imagelist1.AddMasked(abitmap, clWhite); abitmap.Empty; abitmap.LoadFromFile('h1.bmp'); imagelist1.AddMasked(abitmap, clWhite); imagelist1.Draw(image1.Canvas, 0, 0, 0); imagelist1.Draw(image1.Canvas, 0, 0, 1); imagelist1.Draw(image1.Canvas, 0, 0, 2); abitmap.free;