我有一个颜色A,我想通过使用颜色B转换成C颜色。所以我想知道GDI +中的混合公式F,其中F = F(A,B )= C. A是 “底色”,而B是一个覆盖颜色上述A,其与A一起产生C.GDI的混合公式+
干杯,
//马格努斯
我有一个颜色A,我想通过使用颜色B转换成C颜色。所以我想知道GDI +中的混合公式F,其中F = F(A,B )= C. A是 “底色”,而B是一个覆盖颜色上述A,其与A一起产生C.GDI的混合公式+
干杯,
//马格努斯
这被称为Alpha Blending。
使用以下算法用于R,G和B分量,其中alpha是0和1之间
newColor = MAX(255, (1 - alpha) * background + alpha * overlay)
背景和叠加的单个alpha值?或者你的意思是(1-alpha_background)* background + alpha_overlay * overlay? – ralphtheninja 2009-11-11 23:52:11
Aaah ok,背景在这里完全不透明。 – ralphtheninja 2009-11-12 00:02:19
基本上(α,红,绿,蓝以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 +在前景阿尔法变化时上下不一致。这个功能更精确。
我假设B颜色是半透明的? – SLaks 2009-11-11 23:35:52
如果您的意思是B的alpha值小于1,那么:) – ralphtheninja 2009-11-11 23:50:27