有两个bmp图片,比如放在两个Tbitmap中 分别是 A B 
A图为背景图片 
B图为前景图片 比如是一个人物,需要透明部分的是黑色(maskcolor=0) 
maskcolor不一定是黑色,用and方式copy是不可以的。问题一: 
如何让B图叠加显示在A图上?即人物显示在背景图上,不显示人物周边的黑色(黑色是maskcolor需要透明) 问题二: 
在问题一基础上实现B图的半透明效果,即Alpha混合。比如设置Alpha值为100. 请大侠给出详细代码。 
为了处理速度,循环处理像素的方法是不行的。 谢谢,急等待。谢谢!(图像处理板块等两天了没人会)

解决方案 »

  1.   

    http://www.cnblogs.com/del/archive/2008/07/01/1233470.html
    http://www.cnblogs.com/del/archive/2008/07/05/1236006.html
      

  2.   

    既然你对问题这么急,怎么才给20分呢?这样只能显示你对问题不够重视。你的问题也是我曾经的问题,如果有人能给你写出没有BUG的代码,我可以开贴送他100分,不像你这么小气。
      

  3.   

    分可以再给,同样的帖子我已经发了好几份了。不知道还要问几次怕分不够用。不是图片控件叠加啊,是图像处理 把图b复制到图a上 复制不包括maskcolor部分。
    跟图片框设置透明是没关系的。
      

  4.   

    人家告诉你方法了,在GDI+中有一个处理图像的可以实现你的需求的,要是别人给你写这个代码需要花的时间不少的。
      

  5.   

    搜一下CSDN的贴子,有好多,用GDI+来画就好了,你可以指定Alpha的透明值
      

  6.   

    哈哈,我又来赚这20分了
    function IntToByte(i: Integer): Byte;
    begin
      if i > 255 then
        Result := 255
      else if i < 0 then
        Result := 0
      else
        Result := i;
    end;procedure BmpAlphaBlend(var dBmp: TBitMap; sBmp: TBitmap; Pos: TPoint; Alpha: integer; TranColor: TColor = -1);
    type
      tagRGBTRIPLE = packed record
        rgbtBlue: Byte;
        rgbtGreen: Byte;
        rgbtRed: Byte;
      end;
      TRGBTriple = tagRGBTRIPLE;
      PRGBTripleArray = ^TRGBTripleArray;
      TRGBTripleArray = array[0..32767] of TRGBTriple;
      function GetSLColor(pRGB: TRGBTriple): TColor;
      begin
        Result := RGB(pRGB.rgbtRed, pRGB.rgbtGreen, pRGB.rgbtBlue);
      end;
    var
      p0, p1: PRGBTripleArray;
      r, g, b, p, x, y: Integer;
    begin
      sBmp.PixelFormat := pf24bit;
      dBmp.PixelFormat := pf24bit;
      if TranColor = -1 then
        TranColor := sBmp.Canvas.Pixels[0, 0];
      for y := 0 to sBmp.Height - 1 do
        if (y + Pos.y >= 0) and (y + Pos.Y < dBmp.Height) then
        begin
          p0 := dBmp.ScanLine[y + Pos.y];
          p1 := sBmp.ScanLine[y];
          for x := 0 to sBmp.Width - 1 do
            if (x + pos.X >= 0) and (x + Pos.X < dBmp.Width) then
              if GetSLCOlor(p1[x]) <> TranColor then
              begin
                p0[x + pos.X].rgbtRed := IntToByte((p0[x + pos.X].rgbtRed * (100 - Alpha) +
                  p1[x].rgbtRed * Alpha) div 100);            p0[x + pos.X].rgbtGreen := IntToByte((p0[x + pos.X].rgbtGreen * (100 - Alpha) +
                  p1[x].rgbtGreen * Alpha) div 100);            p0[x + pos.X].rgbtBlue := IntToByte((p0[x + pos.X].rgbtBlue * (100 - Alpha) +
                  p1[x].rgbtBlue * Alpha) div 100);
              end;
        end;end;procedure TForm1.Button1Click(Sender: TObject);
    var
      brBmp, srcBmp: TBitmap;
    begin
    //
      brBmp := TBitmap.Create;
      brBmp.LoadFromFile('c:\a.bmp');
      brBmp.PixelFormat := pf24bit;  srcBmp := TBitmap.Create;
      srcBmp.LoadFromFile('c:\b.bmp');
      srcBmp.PixelFormat := pf24bit;  BmpAlphaBlend(
        brBmp, //背景图(大图,也是结果图)
        srcBmp, //需要合成的小图
        Point(60, 60), //画小图的坐标
        100, //半透明度
        -1//需要透明的颜色(用于不规则图形,-1就表示以0,0位置的颜色为透明色)
        );  canvas.Draw(0, 0, brBmp);
      brBmp.Free;
      srcBmp.Free;
    end;
      

  7.   

    谢谢你,不过我再等几天结帖。我还想知道是否有快速的方法实现图片叠加。
    不是半透明而是有透明部分(maskcolor)比如 一个是风景图片(背景图片) 一个是抠图后的人物图片(人物的背景是指定的maskcolor 比如是红色)要求合成一个 背景图上有这个人物图(忽略maskcolor部分的叠加)我现在的处理方式是像素方式,比较慢 因为要同时处理几十张图每张图要这样处理数张叠加。
    我的方式太慢。希望有更快的方式。
    如果没有,我过2天就结帖了。