发布时间:2025-12-09 22:15:45 浏览次数:4
AlphaBlend
该函数显示拥有透明或半透明像素的位图。
Syntax
BOOL AlphaBlend (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))如果目标位图有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 如果目标位图的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;