프로그래밍 노트

[델파이] 투명한 BMP 그리기 본문

델파이

[델파이] 투명한 BMP 그리기

떡잎 2009. 12. 31. 16:24



 

procedure DrawTransparentBmp(Cnv: TCanvas; x,y: Integer; Bmp: TBitmap;
                             clTransparent: TColor);
var
  bmpXOR, bmpAND, bmpINVAND, bmpTarget: TBitmap;
  oldcol: Longint;
begin
  try
    bmpAND            := TBitmap.Create;
    bmpAND.Width      := Bmp.Width;
    bmpAND.Height     := Bmp.Height;
    bmpAND.Monochrome := True;
    oldcol := SetBkColor(Bmp.Canvas.Handle, ColorToRGB(clTransparent));
    BitBlt(bmpAND.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Bmp.Canvas.Handle,
           0,0, SRCCOPY);
    SetBkColor(Bmp.Canvas.Handle, oldcol);

    bmpINVAND         := TBitmap.Create;
    bmpINVAND.Width   := Bmp.Width;
    bmpINVAND.Height  := Bmp.Height;
    bmpINVAND.Monochrome := True;
    BitBlt(bmpINVAND.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height,
           bmpAND.Canvas.Handle, 0,0, NOTSRCCOPY);

    bmpXOR            := TBitmap.Create;
    bmpXOR.Width      := Bmp.Width;
    bmpXOR.Height     := Bmp.Height;
    BitBlt(bmpXOR.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Bmp.Canvas.Handle,
           0,0, SRCCOPY);
    BitBlt(bmpXOR.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height,
           bmpINVAND.Canvas.Handle, 0,0, SRCAND);

    bmpTarget         := TBitmap.Create;
    bmpTarget.Width   := Bmp.Width;
    bmpTarget.Height  := Bmp.Height;
    BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height, Cnv.Handle, x,y,
           SRCCOPY);
    BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height,
           bmpAND.Canvas.Handle, 0,0, SRCAND);
    BitBlt(bmpTarget.Canvas.Handle, 0,0,Bmp.Width,Bmp.Height,
           bmpXOR.Canvas.Handle, 0,0, SRCINVERT);
    BitBlt(Cnv.Handle, x,y,Bmp.Width,Bmp.Height, bmpTarget.Canvas.Handle, 0,0,
           SRCCOPY);
  finally
    bmpXOR.Free;
    bmpAND.Free;
    bmpINVAND.Free;
    bmpTarget.Free;
  end;
end;


 

procedure TForm1.Button1Click(Sender: TObject);
begin
  DrawTransparentBmp(Image2.Canvas, 10, 10, Image1.Picture.Bitmap, clBlack);
end;


그냥 가져다 쓰면 투명한 BMP가 그려진다.

원문소스
How to draw a transparent bitmap  (PEPS ^^) an article on delphi3000.com      
 

Comments