BLENDFUNCTION

BYTE BYTE BYTE

BLENDFUNCTION結構體

AlphaBlend是Window自帶的GDI函式,在作GUI的時候為了達到更漂亮的效果我們常常用它。 
這種結構的混合控制通過指定源和目標點陣圖的混合功能。 
typedef struct _BLENDFUNCTION {
BYTE BlendOp;
BYTE BlendFlags;
BYTE SourceConstantAlpha;
BYTE AlphaFormat;
} BLENDFUNCTION, *PBLENDFUNCTION, *LPBLENDFUNCTION;
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),之後才能被調用。
備註:
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

相關詞條

相關搜尋

熱門詞條

聯絡我們