如何将一仅含文字的小图叠加到另一图片上并呈透明,也就是大图片的图像透过小图片的没有文字的部分显示出来?小图片中的文字是经过特殊加工的,不能通过Textout来输出

解决方案 »

  1.   

    刚才写了一个,透明的颜色是dBmp图象中坐标为[0,0]的颜色:
    procedure DrawTransparent(var sBmp: TBitMap; dBmp: TBitMap; PosX, PosY:
      Integer);
    type
      PRGBTripleArray = ^TRGBTripleArray;
      TRGBTripleArray = array[0..32767] of TRGBTriple;
      function GetSLCOlor(pRGB: TRGBTriple): TColor;
      begin
        Result := RGB(pRGB.rgbtRed, pRGB.rgbtGreen, pRGB.rgbtBlue);
      end;
    var
      b, p: PRGBTripleArray;
      x, y: Integer;
      BaseColor: TColor;
    begin
      p := dBmp.scanline[0];
      BaseCOlor := GetSLCOlor(p[0]);
      for y := 0 to dBmp.Height - 1 do
      begin
        p := dBmp.scanline[y];
        b := sBmp.ScanLine[y + PosY];
        for x := 0 to (dBmp.Width - 1) do
        begin
          if GetSLCOlor(p[x]) <> BaseCOlor then
            b[x + PosX] := p[x];
        end;
      end;end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      bmp:TBitMap;
    begin
    try
      bmp:=TBitMap.Create ;
      bmp.Assign(Image1.Picture);
      DrawTransparent(bmp,Image2.Picture.Bitmap ,10,10);
      image1.Picture.Assign(bmp);
      image1.Refresh ;
    finally
      bmp.free;
    end;
    end;
      

  2.   

    忘记加了一句,就是在  BaseCOlor := GetSLCOlor(p[0])下面加:
      if (Pox>sBmp.Width)or(PosY>sBmp.Height ) then
      Exit;以防止画的坐标超出背景图象大小!!
      

  3.   

    小图片是什么格式的?
    TBitmap对象有个TransparentColor属性,设置一下就可以了,很方便的。