複製鏈接
請複製以下鏈接發送給好友

BLENDFUNCTION

鎖定
BLENDFUNCTION 通過指定源和目標位圖的透明混合參數來控制透明混合 [1] 
外文名
BLENDFUNCTION
類    型
結構

BLENDFUNCTION結構

typedef struct _BLENDFUNCTION {
    BYTE BlendOp;
    BYTE BlendFlags;
    BYTE SourceConstantAlpha;
    BYTE AlphaFormat;
} BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;

BLENDFUNCTION基本概念

AlphaBlend是Window自帶的GDI函數,在用GUI的時候為了達到更漂亮的效果我們常常用它,它的參數之一的類型就是BLENDFUNCTION。

BLENDFUNCTION參數

BlendOp 指定源混合操作。唯一的源和目標的混合方式已定義為AC_SRC_OVER;
BlendFlags 必須是0;
SourceConstantAlpha 指定一個alpha透明度值,這個值將用於整個源位圖;該SourceConstantAlpha值與源位圖的每個像素的alpha值組合;如果設置為0,就會假定你的圖片是透明的;如果需要使用每像素本身的alpha值,設置SourceConstantAlpha值255(不透明);
AlphaFormat 這個參數控制源和目標的解析方式,AlphaFormat參數有以下值:
AC_SRC_ALPHA: 這個值在源有Alpha通道時(也就是操作的圖本身帶有透明通道信息時),提醒系統API調用函數前必須預先乘以alpha值,也就是説位圖上某個像素位置的red、green、blue通道值必須先與alpha相乘。例如,如果alpha透明值是x,那麼red、green、blue三個通道的值必須乘以x並且再除以255(因為alpha的值的範圍是0~255),之後才能被調用。

BLENDFUNCTION應用備註

1、當AlphaFormat參數的值是AC_SRC_ALPHA,那麼源位圖必須是32位深,否則的話,AlphaBland函數將調用失敗
2、當BlendOp參數是AC_SRC_OVER時,源位圖根據alpha透明度值直接覆蓋在目標位圖之上
3、如果源位圖不帶有透明度信息(那樣的話,AC_SRC_ALPHA不設置),將由SourceConstanAlpha的值來決定如何混合源位圖與目標位圖,如下表中所示。表中SCA代表SourceConstantAlpha的值,同樣,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))
在這種情況下,如果目標位圖有透明度信息,那麼混合方式將按照下面的公式來:
Dst.Alpha = Src.Alpha * (SCA/255.0) + Dst.Alpha *(1.0 - (SCA/255.0))
4、如果源位圖沒有用SourceConstantAlpha參數值(那表示該參數等於255),每一個像素的透明度將決定源位圖和目標位圖的混合結果,如下所示:
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
在這種情況下,如果如果目標位圖有透明度信息,那麼混合方式將按照下面的公式來:
Dest.alpha = Src.Alpha + (1 - SrcAlpha) * Dst.Alpha
5、如果源位圖既有SourceConstantAlpha值(也就是它的值不是255),每個像素又有透明度值,那麼源位圖的每一個像素將首先乘以SourceConstantAlpha的值,然後根據每個像素的透明度值混合,如下表中所示。同樣,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
參考資料