例如图片1,加图片2(掩码图片),如何得到图片3的效果?图片3就只是显示中间,周围都是透明或半透明的,这样就可以得到一个边缘光滑的图片效果。请求各大神能赐教,最好能有代码,谢谢!

解决方案 »

  1.   

    忘记了说,我使用的是delphi7,拜谢各位大神了
      

  2.   

    函数BitBlt,两次,第一次绘制正确图片用srcCopy参数,第二次绘制掩码图片,用srcand与一下
      

  3.   

    bitblt(image3.Picture.Bitmap.Canvas.Handle, 0, 0, 23, 22, image1.Picture.Bitmap.Canvas.Handle, 0, 0, SRCCOPY);bitblt(image3.Picture.Bitmap.Canvas.Handle, 0, 0, 23, 22, image2.Picture.Bitmap.Canvas.Handle, 0, 0, SRCAND);image3.Refresh;请问是不是这样?但没有效果啊。
    用bitblt已经反反复复各种方式都试过,都没有预期的效果。这个掩码图,应该是图1根据图2的颜色,图2是黑色时,图1对应的像素就透明,灰色时,就半透明,根据灰度值决定透明程度吧?
      

  4.   

    http://hi.baidu.com/aclshysmtfbdefd/item/3b68780175fd5beb3599029b
      

  5.   

    用 GDI+, 先画  背景  ,再画   位图。 var
      I, Count: Integer;
      Clsid: TClsid;
      Image: TGpImage;
      bkImage: TGpImage;
      Attr: TGpImageAttributes;
      bmp: TGpBitmap;
      tmp: TGpBitmap;
      tg, bg: TGpGraphics;
      GUID: TGUID;
    begin
        // 打开图像文件
      Image := TGpImage.Create('e:\01.png');
      BkImage := TGpImage.Create('e:\bk.png');
      tmp := TGpBitmap.Create(Image.Width, Image.Height, pf32bppARGB);
      tg := TGpGraphics.Create(tmp);
      bmp := TGpBitmap.Create(Image.Width, Image.Height, pf32bppARGB);
      bg := TGpGraphics.Create(bmp);
      Attr := TGpImageAttributes.Create;
      try
        // 设置透明色范围
        Attr.SetColorKey($FFffffff, $FFffffff);
        Image.GetFrameDimensionsList(@GUID, 1);
        // 获取图像祯数
        Count := Image.GetFrameCount(GUID);
        GetEncoderClsid('image/png', Clsid);    for I := 0 to Count - 1 do
        begin
          // 选择激活祯
          Image.SelectActiveFrame(GUID, I);
          // 画当前祯到临时图
          tg.DrawImage(Image, 0, 0, Image.Width, Image.Height);
          // 合成图初始化为透明色
          bg.Clear(0);
          // 画背景图,如不需要背景图,可将下面注释掉
          bg.DrawImage(BkImage, 0, 0, bmp.Width, bmp.Height);
          // 画临时图
          bg.DrawImage(tmp, GpRect(0, 0, bmp.Width, bmp.Height),
              0, 0, tmp.Width, tmp.Height, utPixel, Attr);
          // 保存
          bmp.Save('e:\01-' + IntToStr(I) + '.png', Clsid);
        end;
      finally
        Attr.Free;
        bg.Free;
        bmp.Free;
        tg.Free;
        tmp.Free;
        BkImage.Free;
        Image.Free;
      end;
      

  6.   

    2次 非与或  NotXOR