AlphaBlend是Window自帶的GDI函數(shù),在作GUI的時候為了達到更漂亮的效果我們常常用它。 這種結構的混合控制通過指定源和目標位圖的混合功能?!?br> 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 這個參數(shù)控制源和目標的解析方式,AlphaFormat參數(shù)有以下值: AC_SRC_ALPHA: 這個值在源或者目標本身有Alpha通道時(也就是操作的圖本身帶有透明通道信息時),提醒系統(tǒng)API調用函數(shù)前必須預先乘以alpha值,也就是說位圖上某個像素位置的red、green、blue通道值必須先與alpha相乘。例如,如果alpha透明值是x,那么red、green、blue三個通道的值必須乘以x并且再除以255(因為alpha的值的范圍是0~255),之后才能被調用。 備注: 1、當AlphaFormat參數(shù)的值是AC_SRC_ALPHA,那么源位圖必須是32位深,否則的話,AlphaBland函數(shù)將調用失敗 2、當BlendOp參數(shù)是AC_SRC_OVER時,源位圖根據(jù)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參數(shù)值(那表示該參數(shù)等于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的值,然后根據(jù)每個像素的透明度值混合,如下表中所示。同樣,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 |
|
來自: 昵稱15753510 > 《API》