我只需要一个函数,它采用两种颜色并返回它们的混合版本。它应该以与 GDI 相同的方式混合它们。
我认为在 GDI 中混合两种 ARGB 颜色时得到的 alpha 值是这样计算的:
Private Function blend(alphaBelow As Single, alphaAbove As Single) As Single
Return alphaBelow + (1.0 - alphaBelow) * alphaAbove
End Function
我还发现了这个页面,微软说 R、G 和 B 值是使用这个公式计算的:
displayColor = sourceColor × alpha / 255 + backgroundColor × (255 – alpha) / 255
但是,我无法让它工作:
Color1: A=164, R=111, G=78, B=129
Color2: A=241, R=152, G=22, B=48
Blended in GDI: A=250, R=150, G=24, B=50
R:
150 = 152 * x / 255 + 111 * (255 - x) / 255
x = 9945/41 = 242.5609756097560975609756097561
G:
24 = 22 * x / 255 + 78 * (255 - x) / 255
x = 6885/28 = 245.89285714285714285714285714286
B:
50 = 48 * x / 255 + 129 * (255 - x) / 255
x = 6715/27 = 248.7037037037037037037037037037
如您所见,我为每个 R、G 和 B 值获得了不同的 alpha 值。这个数字是如何计算的?
编辑:
Color1 和 Color2 只是我想混合在一起的一些随机 ARGB 颜色。如果您在位图中将它们绘制在彼此之上,您将获得“在 GDI 中混合”。
将颜色与 GDI 混合的代码:
Dim B As New Bitmap(Width, Height, Imaging.PixelFormat.Format32bppPArgb)
Dim G = Graphics.FromImage(B)
Dim w = B.Width - 1, h = B.Height - 1
G.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias
Dim pth As New Drawing2D.GraphicsPath
pth.AddRectangle(New Rectangle(0, 0, w, h))
Dim c1 = RandomColor(), c2 = RandomColor()
G.FillPath(New SolidBrush(c1), pth)
G.FillPath(New SolidBrush(c2), pth)
Dim resoult As Color = B.GetPixel(w / 2, h / 2)