我有两个bitmap想实现按一定透明度来融合,使用以下代码
  nToX := Min(X + Src.Width, Dest.Width);
  nToY := Min(Y + Src.Height, Dest.Height);
  bf.BlendOp := AC_SRC_OVER;
  bf.BlendFlags := 0;
  bf.SourceConstantAlpha := Alpha mod 255;
  bf.AlphaFormat := 0 ;
 AlphaBlend(Dest.Handle, X, Y, nToX, nToY, Src.Handle, 1, 1, nToX - X, nToY - Y, bf);
其中X, Y就是Src要在Dest上画的起始点坐标,nToX, nToY这个是右下解的坐标.可是为什么我执行都不成功呢?
我的系统是windows2003这个API应该是支持的呀.
不知道大家能不能给我指出一下问题所在?

解决方案 »

  1.   

    前几天刚在群里跟他们讨论过这个玩意具体咋实现,问CoolSlob和饭桶,他们都有现成的代码说说原理简易Alpha混合算法
     
     首先,要能取得上层与下层颜色的 RGB三基色,然后用r,g,b 为最后取得的颜色值;r1,g1,b1是上层的颜色值;r2,g2,b2是下层颜色值r = r1/2 + r2/2;g = g1/2 + g2/2;b = b1/2 + b2/2;以上为50%透明。若要使用不同的透明度用以下算法(ALPHA=透明度):(50%以下)r = r1 - r1/ALPHA + r2/ALPHA;g = g1 - g1/ALPHA + g2/ALPHA;b = b1 - b1/ALPHA + b2/ALPHA;(50%以上)r = r1/ALPHA + r2 - r2/ALPHA;g = g1/ALPHA + g2 - g2/ALPHA;b = b1/ALPHA + b2 - b2/ALPHA;
     
     
     
      

  2.   

    chijingde(AD):你用的方法我现在就在用,但是感觉不好,想用这个API使用GDI+来实现,我查了很多资料,他们都是这么调用的,可是为什么我调用不成功?
      

  3.   

    alpha混合的基本公式:result = ALPHA * srcPixel + ( 1 - ALPHA ) * destPixel
      

  4.   

    这问题怎么回答?Src和Dest是什么?TBitmap?那很简单Dest.Handle
    Src.Handle
    =>
    Dest.Canvas.Handle
    Src.Canvas.Handle参数类型是什么?HDC,而不是HBITMAP。这种东西查查MSDN,很简单。还有种可能,你根本就没调到GDI
    AlphaBlend
    =>
    Windows.AlphaBlend为什么一定要用GDI/GDI+?又没效率,又不够灵活。