2009-11-11 43 views
0

我有一个颜色A,我想通过使用颜色B转换成C颜色。所以我想知道GDI +中的混合公式F,其中F = F(A,B )= C. A是 “底色”,而B是一个覆盖颜色上述A,其与A一起产生C.GDI的混合公式+

干杯,

//马格努斯

+0

我假设B颜色是半透明的? – SLaks 2009-11-11 23:35:52

+0

如果您的意思是B的alpha值小于1,那么:) – ralphtheninja 2009-11-11 23:50:27

回答

2

这被称为Alpha Blending

使用以下算法用于R,G和B分量,其中alpha是0和1之间

newColor = MAX(255, (1 - alpha) * background + alpha * overlay) 
+0

背景和叠加的单个alpha值?或者你的意思是(1-alpha_background)* background + alpha_overlay * overlay? – ralphtheninja 2009-11-11 23:52:11

+0

Aaah ok,背景在这里完全不透明。 – ralphtheninja 2009-11-12 00:02:19

0

基本上(α,红,绿,蓝以0至1的范围):

Result.Alpha = BackColor.Alpha + ForeColor.Alpha - (BackColor.Alpha * ForeColor.Alpha)
Result.Red =((ForeColor.Red * ForeColor.Alpha)+(BackColor.Red * BackColor.Alpha *(1 - ForeColor.Alpha)))/ Result.Alpha
(将'red'替换为'green'和'blue'以获得corr esponding函数)

对于32位颜色,在VB.NET(有点优化):

Shared Function Flatten(ByVal BackColor As Color, ByVal ForeColor As Color) As Color 
    If ForeColor.A = 0 Then Return BackColor ' Prevent division by zero 
    If ForeColor.A = 255 Then Return ForeColor ' Shortcut 

    Dim BackAlphaDbl As Single = CSng(BackColor.A) ' Convert to single to prevent in-calculation 8 bit overflow 
    Dim ForeAlphaDbl As Single = CSng(ForeColor.A) 

    Dim ForeAlphaNormalized As Single = ForeAlphaDbl/255 ' Precalculate for triple use 
    Dim BackcolorMultiplier As Single = BackAlphaDbl * (1 - ForeAlphaNormalized) ' Precalculate 

    Dim Alpha As Single = BackAlphaDbl + ForeAlphaDbl - BackAlphaDbl * ForeAlphaNormalized 

    Return Color.FromArgb(Alpha, (ForeColor.R * ForeAlphaDbl + BackColor.R * BackcolorMultiplier)/Alpha, (ForeColor.G * ForeAlphaDbl + BackColor.G * BackcolorMultiplier)/Alpha, (ForeColor.B * ForeAlphaDbl + BackColor.B * BackcolorMultiplier)/Alpha) 
End Function 

我用纸和笔这出,并通过与GDI重叠图像+和测试所得颜色验证它。这个函数和GDI +的唯一区别在于GDI +在前景阿尔法变化时上下不一致。这个功能更精确。