AlphaBlend 详解

发布时间:2025-12-09 22:15:45 浏览次数:4

AlphaBlend 

 

该函数显示拥有透明或半透明像素的位图。 

Syntax

BOOL  AlphaBlend (
     HDC    hdcDest ,
     int      nXOriginDest ,   int    nYOriginDest ,   int    nWidthDest ,   int    nHeightDest ,
     HDC    hdcSrc ,
     int      nXOriginSrc ,     int    nYOriginSrc ,     int    nWidthSrc ,    int    nHeightSrc ,
     BLENDFUNCTION   blendFunction
    );

Parameters 

hdcDest: [in] 目标DC的句柄

nXOriginDest、nYOriginDest: [in] 目标矩形左上角X坐标和Y坐标,按逻辑单元

nWidthDest、nHeightDest: [in] 目标矩形的宽度和高度,不能为负数,按逻辑单元

hdcSrc: [in] 源DC的句柄

nXOriginSrc、nYOriginSrc: [in] 源矩形左上角X坐标和Y坐标,按逻辑单元

nWidthSrc、nHeightSrc: [in] 源矩形的宽度和高度,不能为负数,按逻辑单元

blendFunction: [in] 指定用于源位图和目标位图使用的alpha混合功能,用于整个源位图的全局alpha值和格式信息。源和目标混合功能当前只限为AC_SRC_OVER

 

该结构控制指定用于源位图和目标位图使用混合功能 

Syntax

typedef struct _BLENDFUNCTION {

  BYTE  BlendOp;

  BYTE  BlendFlags;

  BYTE  SourceConstantAlpha;

  BYTE  AlphaFormat;

}BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION; 

 

Members:

BlendOp: 指定源混合操作。目前,唯一的源和目标混合操作被定义为 AC_SRC_OVER。 详情,请参阅下面的备注部分。

BlendFlags: 必须为 0。

SourceConstantAlpha: 指定用于整张源位图的Alpha透明度值。 SourceConstantAlpha 值和每个像素的alpha值合并。如果 SourceConstantAlpha 为0,那么图像就为完全透明;如果 SourceConstantAlpha 为255,则图像为不透明。

AlphaFormat: 该成员控制源和目标位图被解释的方式。 下面显示了AlphaFormat值:

    AC_SRC_ALPHA      此标志位图时设置有一个Alpha通道(即每像素都有alpha值)。 由于此API使用预乘α,图中的红色,绿色和蓝色通道值必须预乘alpha通道值。 例如如果alpha通道值为x,那么在调用之前必,红色,绿色和蓝色通道须乘以x然后除以0xff。 


Remarks

   当AlphaFormat参数为AC_SRC_ALPHA,源位图必须是32色。 如果不是,AlphaBlend函数将失败。

   当BlendOp参数为AC_SRC_OVER,源位图将根据源像素的alpha值置于目标位图上。

   如果源位图没有设置AC_SRC_ALPHA,由在SourceConstantAlpha值确定源和目标位图混合,如下表所示。 注意 ,SourceConstantAlpha的值为SCA。 此外,SCA除以255是因为它的值范围为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))

   如果目标位图有alpha通道,则混合如下。

  Dst . Alpha  =  Src . Alpha  * ( SCA /255.0) +  Dst . Alpha  * (1.0 - ( SCA /255.0))


   如果源位图不使用SourceConstantAlpha(即,它等于0xFF),每个像素的alpha值决定源和目标位图的混合,如下列公式所示。

Dst . Red    =  Src . Red    + (1 -  Src . Alpha ) *  Dst . Red 
Dst . Green  =  Src . Green  + (1 -  Src . Alpha ) *  Dst . Green 
Dst.Blue  = Src.Blue  + (1 - Src.Alpha) * Dst.Blue 

   如果目标位图的alpha通道,则混合如下。
 Dst.alpha = Src.Alpha + (1 - Src.Alpha) * Dst.Alpha


   如果源位图既有SourceConstantAlpha(也就是说,它不是0xFF)和每像素都有alpha值,那么源位图先预乘以SourceConstantAlpha,然后根据每个像素的alpha值混合。如下列方程显示。 请注意,SourceConstantAlpha除以255是因为它的值范围从0到255。

Src . Red    =  Src . Red    *  SourceConstantAlpha  / 255.0; 
Src . Green  =  Src . Green  *  SourceConstantAlpha  / 255.0; 
Src . Blue   =  Src . Blue   *  SourceConstantAlpha  / 255.0; 
Src . Alpha  =  Src . Alpha  *  SourceConstantAlpha  / 255.0; 
Dst . Red    =  Src . Red    + (1 -  Src . Alpha ) *  Dst . Red 
Dst . Green  =  Src . Green  + (1 -  Src . Alpha ) *  Dst . Green 
Dst . Blue   =  Src . Blue   + (1 -  Src . Alpha ) *  Dst . Blue 
Dst . Alpha  =  Src . Alpha  + (1 -  Src . Alpha ) *  Dst . Alpha
需要做网站?需要网络推广?欢迎咨询客户经理 13272073477