Eu sei que algumas funções
como Canvas.Draw já
consideram a transparência das imagens, quando ocorre
a transferência, porém o Delphi ainda se
atrapalha um pouco quando a imagem não é true
color. Também sei que nos dias atuais, nem faz muito
sentido ficar poupando espaço com imagens 256, 16 ou
2 cores, quando os micros esbanjam megas e megas de memória
RAM, porém esta é uma alternativa interessante.
Em primeiro lugar, porque até
imagens com 16 cores são tratadas adequadamente e em
segundo porque a definição da cor de transparência
já vai incorporada na chamada. E em terceiro lugar, é
possível definir um retângulo dentro da imagem
fonte e o equivalente a isso, no Delphi, é a instrução
Canvas.CopyRect, que não
faz a transferência com transparência.
procedure DrawTrans(DstCanvas: TCanvas; X,Y: smallint;
SrcBmp: TBitmap; Px,Py,Pw,Ph: smallint;
AColor: TColor);
var
ANDBmp, ORBmp: TBitmap;
CM: TCopyMode;
begin
ANDBmp:= nil; ORBmp:= nil;
try
ANDBmp:= TBitmap.Create;
ORBmp:= TBitmap.Create;
ORBmp.Width:= Pw;
ORBmp.Height:= Ph;
ORBmp.Canvas.Brush.Color:= clBlack;
ORBmp.Canvas.CopyMode:= cmSrcCopy;
ORBmp.Canvas.BrushCopy(bounds(0,0,Pw,Ph),
SrcBmp, bounds(Px,Py,Pw,Ph), AColor);
ANDBmp.Width:= Pw;
ANDBmp.Height:= Ph;
ANDBmp.Canvas.Brush.Color:= clWhite;
ANDBmp.Canvas.CopyMode:= cmSrcInvert;
ANDBmp.Canvas.BrushCopy(bounds(0,0,Pw,Ph),
SrcBmp, bounds(Px,Py,Pw,Ph), AColor);
CM:= DstCanvas.CopyMode;
DstCanvas.CopyMode:= cmSrcAnd;
DstCanvas.Draw(X, Y, ANDBmp);
DstCanvas.CopyMode:= cmSrcPaint;
DstCanvas.Draw(X, Y, ORBmp);
DstCanvas.CopyMode:= CM;
finally
ANDBmp.Free; ORBmp.Free;
end;
end;