2013-09-22 9 views
5

同じサイズの2つ以上の異なるbmp画像を重ね合わせて1つにマージすることは可能ですか? Windows XPでペイントしたのと同じ方法MSペイント:別のペイントに1つの画像を貼り付け、セカンダリカラーを透明にします。画像を1つの画像に重ねる

Example

+5

可能。 [その多くは](http://english.rejbrand.se/algosim/manual/pmproc/pmproc.html)自分で行ってください。 –

+1

@AndreasRejbrand:そのリンクと、より具体的にはそこにあるコンテンツに感謝します。素晴らしい参照。 –

答えて

9

あなたは、その旨をTBitmapTransparentプロパティを使用することができます。あなたのビットマップは黒の境界線を持つので、自動透過色(イメージデータの最初のピクセル)は機能せず、TransparentColorプロパティも 'clWhite'に設定する必要があります。以下のように、第2のビットマップの場合

var 
    bmp1, bmp2: TBitmap; 
begin 
    bmp1 := TBitmap.Create; 
    bmp1.LoadFromFile('...\test1.bmp'); 

    bmp2 := TBitmap.Create; 
    bmp2.LoadFromFile('...\test2.bmp'); 

// bmp2.PixelFormat := pf24bit; // with 32 bit images I need this, don't know why 
    bmp2.Transparent := True; 
    bmp2.TransparentColor := clWhite; 
    bmp1.Canvas.Draw(0, 0, bmp2); // draw bmp2 over bmp1 

    // this is how the merged image looks like 
    Canvas.Draw(0, 0, bmp1); 
    .. 
+0

完璧に動作します!このコードを使っている人には、bmp1とbmp2が同じサイズになるように注意してください。 bmp2がbmp1より小さい場合、bmp2は画像の左上隅に配置されます。 –

3

は、あなたがBitBlt(ビットブロック転送)のラスタ動作でマスクとして使用することができ、白黒である:確か

Windows.BitBlt(Bmp3.Canvas.Handle, 0, 0, Bmp3.Width, Bmp3.Height, 
    Bmp1.Canvas.Handle, 0, 0, SRCCOPY); 
    Windows.BitBlt(Bmp3.Canvas.Handle, 0, 0, Bmp3.Width, Bmp3.Height, 
    Bmp2.Canvas.Handle, 0, 0, SRCAND);