2013-06-09 3 views
0

두 가지 색상을 사용하고 혼합 된 버전을 반환하는 함수가 필요합니다. GDI와 같은 방식으로 혼합해야합니다. Microsoft는이를 사용하여 R, G 및 B 값을 계산하는 것을 말한다 어디도 this page을 발견GDI 알파 색상은 어떻게 혼합됩니까?

Private Function blend(alphaBelow As Single, alphaAbove As Single) As Single 
    Return alphaBelow + (1.0 - alphaBelow) * alphaAbove 
End Function 

:

나는 GDI 두 ARGB 색상을 혼합 할 때 당신이 얻을 알파 값은 다음과 같이 계산된다 생각 화학식 :

displayColor = sourceColor × 알파/255 +의 backgroundColor × (255 - 알파)/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 값의 각각에 대해 서로 다른 알파 값을 얻는다. 이 숫자는 어떻게 계산됩니까?

편집 :

COLOR1 및 COLOR2 내가 함께 혼합 할 그냥 무작위 ARGB 색상입니다. "Blended in 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) 
+1

첫 번째 표에서 숫자를 얻은 방법을 정확하게 설명 할 수 있습니까? –

+0

Color1과 Color2는 혼합하려는 임의의 임의의 ARGB 색상입니다. "Blended in GDI"는 비트 맵에서 서로 위에 그릴 때 얻는 것입니다. – BlackCap

+0

당신은 정확히 어떻게 서로의 위에 그렸습니다. 일부 코드는 귀하가 말하는 것에 대해 정확히 알고 있음을 보증합니다. –

답변

2

. 미래에 불면증이 필요한 경우에 대비해서 여기에 올리겠습니다.

Private Function MixColors(c1 As Color, c2 As Color) As Color 
    Dim c1a = c1.A/255, c2a = c2.A/255, alp = AlphaBlend(c1a, c2a) 

    Dim a = alp * 255 
    Dim r = ColorBlend(c1.R, c1a, c2.R, c2a, alp) 
    Dim g = ColorBlend(c1.G, c1a, c2.G, c2a, alp) 
    Dim b = ColorBlend(c1.B, c1a, c2.B, c2a, alp) 

    Return Color.FromArgb(CInt(a), CInt(r), CInt(g), CInt(b)) 
End Function 

Private Function ColorBlend(c1r%, c1a#, c2r%, c2a#, alp#) As Single 
    Return (c2r * c2a + c1r * c1a * (1 - c2a))/alp 
End Function 

Private Function AlphaBlend(alphaBelow!, alphaAbove!) As Double 
    Return alphaBelow + (1.0 - alphaBelow) * alphaAbove 
End Function 

나 자신으로이 기능을 개발하고 마이크로 소프트 또는 아무것도에서 그것을 얻을하지 않았다 있습니다, 그래서 나는 GDI가하는 것과 같은 방식으로 색의 혼합을 계산 증명할 수 없습니다. 모든 기능이 완전히 작동하지 못했기 때문에 GDI와 동일한 재사용을 반환 할 것이라고 보장 할 수는 없지만 매우 가까워 야합니다.

관련 문제