Dst.Red   =   Src.Red   +   (1   -   Src.Alpha)   *   Dst.Red 
这是所用的公式。然而覆盖所要达到的目的显然是src.Alpha = 1 时,Dst.Red=Src.Red ,且 src.Alpha = 1 时,Dst.Red=Dst.Red
就像一个定比分点一样,那么这时的公式应该是:Dst.Red   =   Src.Alpha * Src.Red   +   (1   -   Src.Alpha)   *   Dst.Red为什么不是这样呢?将png转换为bmp,就必须让rgb通道的透明区域变为黑色才能正常显示,有白色就不能用Alpha隐藏了。如何解决这个问题,实现图片覆盖?还有一个问题,LR_……常数和一些其他常数应该在哪里找?

解决方案 »

  1.   

    实际应用中,Alpha 是一个字节,值域 [0, 255],公式相应变为:
    Dst.Red = Src.Red * (SCA/255.0) + Dst.Red * (1.0 - (SCA/255.0))
    Dst.Green = Src.Green * (SCA/255.0) + Dst.Green * (1.0 - (SCA/255.0))
    Dst.Blue = Src.Blue * (SCA/255.0) + Dst.Blue * (1.0 - (SCA/255.0))
    式中“SCA”指源的 Alpha 值。
    需要注意的是,有些场合源的每个通道是预先乘上了 Alpha 值的(因为有些 Windows API 函数要求这样),这时公式中的第一项就直接用“Src.Red”(其余依次类推)了。
      

  2.   

    用alphablend显示带alpha通道的数据,数据必须是32位的,并且要是PARGB格式的数据。
      

  3.   

    不是不是,当SCA设置为255时,是用32位位图的Alpha通道绘图大家可以试试,创建一个32位位图,RGB通道为全白,Alpha通道全部为0(完全透明),用LoadImage载入图像,然后
    AlphaBlend,得到的图片是白色的。这个和微软给出的公式一致,但微软为什么那么写呢?微软的描述在这里:
    http://msdn.microsoft.com/en-us/library/ms532306.aspx
      

  4.   


    PARGB是这样吗?除了常用的RGB格式,Windows在GDI+中开始支持Alpha增强格式,也就是ARGB。还有一种是PARGB,P代表premultiplied,将三原色增强到超过16bit,这也是未来的颜色,对照片和超级显示器有好处,普通的应用没有什么意义。
      

  5.   

    在包含Alpha的图像中,颜色值要乘以Alpha才是实际的颜色
    所以我们可以预先将已经乘以Alpha的颜色值保存起来,这就是PARGB格式
    PARGB的premultiplied就是指的以已经左乘了Alpha也就是说
    PARGB中RGB的值等于ARGB中RGB的值乘以Alpha
    反过来
    ARGB中RGB的值等于PARGB中RGB的值除以Alpha
      

  6.   

    原来如此。
    还有一个问题,loadimage中用到的LR_CREATEDIBSECTION和IMAGE_BITMAP等等常数在哪里?win32api.txt里面没有啊