AlphaBlend 详解
AlphaBlend 该函数显示拥有透明或半透明像素的位图。 SyntaxBOOL AlphaBlend( HDC hdcDest, int nXOriginDest, int nYOriginDest, int nWidthDest, int nHeightDest, HDC hdcSrc,
AlphaBlend
该函数显示拥有透明或半透明像素的位图。
Syntax
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。
Return Value
如果成功,返回TRUE;失败返回FALSE
获取扩展的错误信息,调用 GetLastError , GetLastError会返回:ERROR_INVALID_PARAMETER,代表有一个或多个输入参数错误。
Remarks
如果源矩形和目标矩形大小不同,源位图被缩放以匹配目标矩形。如果使用SetStretchBltMode 函数,iStretchMode 值自动转换为COLORONCOLOR 。
目标坐标使用为目标设备环境指定的转换方式进行转换。源坐标则使用为源设备环境指定的当前转换方式进行转换。
如果源设备环境标识为增强型图元文件设备环境,那么会出错(并且该函数返回FALSE)。
如果目标和源位图的色彩格式不同,那么AlphaBlend将源位图转换以匹配目标位图。
AlphaBlend不支持镜像。如果源或目标区域的宽度或高度为负数,那么调用将失败。
当在打印机上显示时,首先调用 GetDeviceCaps 并传入 SHADEBLENDCAPS 参数检测打印机是否支持 AlphaBlend 混合。记住,对于显示DC,所有混合操作都被支持而且这些标志代表操作是否支持加速。
源矩形必须位于源表面内(即,源矩形范围不能超出源位图的范围),否则将发生错误,函数返回FALSE.
BLENDFUNCTION 结构的 SourceConstantaAlpha 成员指定使用在整个源位图上的 alpha 透明值。SourceConstantAlpha 值和每个像素的alpha值合并。如果 SourceConstantAlpha 为0,那么图像就为完全透明;如果 SourceConstantAlpha 为255,则图像为不透明。
Requirements
Header: windows.h
Library: coredll.lib
Windows Mobile: Windows Mobile Version 5.0 and later
BLENDFUNCTION
该结构控制指定用于源位图和目标位图使用混合功能
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.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通道,则混合如下。
如果源位图不使用SourceConstantAlpha(即,它等于0xFF),每个像素的alpha值决定源和目标位图的混合,如下列公式所示。
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.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
更多推荐



所有评论(0)