在一张图片中叠加多张图片

5

是否可以通过在彼此上叠加来将大小相同的两个或多个不同的bmp图片合并成一个?就像Windows XP的MS Paint中所做的那样:将一张图片粘贴到另一张图片上,其中第二个颜色是透明的。

示例


5
完全可以。我自己也做了很多这样的事情。这里有相关内容。 - Andreas Rejbrand
1
@AndreasRejbrand:感谢您提供的链接,尤其是其中的内容。非常好的参考资料。 - Marjan Venema
2个回答

10

您可以使用TBitmapTransparent属性来实现此效果。由于您的位图具有黑色边框,自动透明颜色(图像数据的第一个像素)将不起作用,因此您还需要将TransparentColor属性设置为“clWhite”。

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);
  ..

完美运行!对于使用此代码的人,需要注意bmp1和bmp2将是相同的大小。如果bmp2比bmp1小,则bmp2将放置在图像的左上角。 - Jacques Koekemoer

4

如果第二个位图是黑白的,您可以将其用作掩码,在使用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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接