Transparência à jato
para qualquer tipo ou formato de imagem (cores)

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;
 
online