天天看點

Remark of BLENDFUNCTION from MSDN

Remarks

When the AlphaFormat member is AC_SRC_ALPHA, the source bitmap must be 32 bpp. If it is not, the AlphaBlend function will fail.

When the BlendOp member is AC_SRC_OVER, the source bitmap is placed over the destination bitmap based on the alpha values of the source pixels.

1.If the source bitmap has no per-pixel alpha value (that is, AC_SRC_ALPHA is not set), the SourceConstantAlpha value determines the blend of the source and destination bitmaps, as shown in the following table. Note that SCA is used for SourceConstantAlpha here. Also, SCA is divided by 255 because it has a value that ranges from 0 to 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))

If the destination bitmap has an alpha channel, then the blend is as follows.

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

2.If the source bitmap does not use SourceConstantAlpha (that is, it equals 0xFF), the per-pixel alpha determines the blend of the source and destination bitmaps, as shown in the following table.

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

3.If the source has both the SourceConstantAlpha (that is, it is not 0xFF) and per-pixel alpha, the source is pre-multiplied by the SourceConstantAlpha and then the blend is based on the per-pixel alpha. The following tables show this. Note that SourceConstantAlpha is divided by 255 because it has a value that ranges from 0 to 255.

Src.Red * SourceConstantAlpha / 255.0;
Src.Green
Src.Blue
Src.Alpha

===========================分割線===========================

 2.

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

3.

srcAlpha
+ (1 - (srcApha/255.0)) * Dst.Red
+ (1 - (srcApha/255.0)) * Dst.Green
+ (1 - (srcApha/255.0)) * Dst.Blue
+ (1 - (srcApha/255.0)) * Dst.Alpha

 MSDN 備注有點錯誤.應該先除以255.0的