如题,我想知道
  result   =   ALPHA   *   srcPixel   +   (   1   -   ALPHA   )   *   destPixel   
或者
  alpha取值在[0,1]之间,0代表完全透明,1代表完全不透明  
  如果alpha取值在[0,255],公式改成  
  R   =   (R(a)*alpha   +   R(b)*(255-alpha))/255中Alpha如何得来的。另外,如果用BitBlt方法来实现透明和AlphaBlender的方法实现透明谁能提供和demo看看,谢谢

解决方案 »

  1.   

    http://topic.csdn.net/u/20080107/09/97469d01-85b4-4aa6-8122-0b359405f201.html
      

  2.   

    Alpha自己确定的图像像素在目标上的比例。使用GDI+可以很轻松的进行透明显示,可参见我的BLOG文章:GDI+ 在Delphi程序的应用 -- 图像的透明显示技巧
      

  3.   

    To jinjazz(近身剪):
       这个地址似乎是本帖地址To maozefa(阿发伯):
       谢谢,你的所有帖子偶都看过了哟。但是很抱歉,我不能调用gdi+,因为我们是自己在Image上画图操作的,我不知道gdi+可否在Image上有Delphi原来TImage一样的操作,如MouseMove,PolyLine....等等,你能告诉我吗?
      

  4.   

    To jinjazz(近身剪):
       这个地址似乎是本帖地址To maozefa(阿发伯):
       谢谢,你的所有帖子偶都看过了哟。但是很抱歉,我不能调用gdi+,因为我们是自己在Image上画图操作的,我不知道gdi+可否在Image上有Delphi原来TImage一样的操作,如MouseMove,PolyLine....等等,你能告诉我吗?
      

  5.   

    不好意思..帖错了,不用gid+是无法实现透明的吧,
    我想贴的地址是
    http://blog.csdn.net/jinjazz/archive/2007/11/01/1860437.aspx
      

  6.   

    一种是用AlphaBlend的Alpha通道,不知道算不算GDI+,应该算吧,和jinjazz贴的原理似乎一样还有就是用封装好的GDI+控件,阿发伯的应该是那样吧还有就是用BitBlt做两次运算不知道我说的对不对,但是这上面说的都是我从网上找的,但是每种方法的实现我还是糊里糊涂
      

  7.   

    我的AlphaBlend,dbmp是背景TBitMap,sbmp是在背景上覆盖的并且能半透明的TBitMap  bf.BlendOp:=AC_SRC_OVER;
      bf.BlendFlags:=0;
      bf.SourceConstantAlpha:=$7f;
      bf.AlphaFormat:=0;
      Windows.AlphaBlend(dbmp.Canvas.Handle,0,0,dbmp.Width,dbmp.Height,sbmp.canvas.Handle,0,0,sbmp.Width,sbmp.Height,bf);运行没结果,嘿嘿,我是不是照葫芦画瓢画错了呀?
      

  8.   

    在TImage上直接用GDI+画透明图像可能不行,你可以用你前面的那个公式对TImage的位图与TImage的背景逐点计算后刷新。
      

  9.   

    jinjazz 还有maozefa大哥,你们有联系方式不?我的是[email protected]或者QQ:19867087,希望能得到你们的指点和交流
      

  10.   

    >>SetWindowLong(Handle, GWL_EXSTYLE, WS_EX_LAYERED or WS_EX_CONTROLPARENT) 
      

  11.   

    这个问题不难,用影子位图,将两幅图用自己的算法画在影子位图上,然后BitBlt影子位图到DC上。
      

  12.   

    没有优化,仅供参考。procedure TForm1.FormPaint(Sender: TObject);
    var
      AShadowBitmap: TBitmap;
      A1stBitmap: TBitmap;
      A2ndBitmap: TBitmap;
      Alpha: Byte;
      r, c: Integer;
    begin
      AShadowBitmap:= TBitmap.Create;
      A1stBitmap:= TBitmap.Create;
      A2ndBitmap:= TBitmap.Create;
      try    AShadowBitmap.Height:= 200;
        AShadowBitmap.Width:= 300;
        A1stBitmap.Height:= AShadowBitmap.Height;
        A1stBitmap.Width:= AShadowBitmap.Width;
        A2ndBitmap.Height:= AShadowBitmap.Height;
        A2ndBitmap.Width:= AShadowBitmap.Width;    A1stBitmap.Canvas.Pen.Width:= 10;
        A1stBitmap.Canvas.Pen.Color:= clRed;
        A1stBitmap.Canvas.MoveTo(0, 0);
        A1stBitmap.Canvas.LineTo(300, 200);    A2ndBitmap.Canvas.Pen.Width:= 10;
        A2ndBitmap.Canvas.Pen.Color:= clBlue;
        A2ndBitmap.Canvas.MoveTo(0, 200);
        A2ndBitmap.Canvas.LineTo(300, 0);    Alpha:= 200;
        for r:= 0 to AShadowBitmap.Height - 1 do begin
          for c:= 0 to AShadowBitmap.Width - 1 do begin
            AShadowBitmap.Canvas.Pixels[c, r]:=
              Round(Alpha / 255 * A1stBitmap.Canvas.Pixels[c, r] + (1 - Alpha / 255) * A2ndBitmap.Canvas.Pixels[c, r]);
          end;
        end;    Canvas.Draw(0, 0, A1stBitmap);
        Canvas.Draw(A1stBitmap.Width + 10, 0, A2ndBitmap);
        Canvas.Draw(0, A1stBitmap.Height + 10, AShadowBitmap);
      finally
        FreeAndNil(A2ndBitmap);
        FreeAndNil(A1stBitmap);
        FreeAndNil(AShadowBitmap);
      end;
    end;
      

  13.   

    今天我试了下用Timage.canvas.Pen.Mode:=pmMask;也可以实现一个Rect在图片上透明
    请问这样做有什么区别吗?似乎更简单了。同时感谢Dext提供的代码。我开始也是和你一样实现的,但是你的更工整了很多,呵呵