문제

ARGB 색상이 있다고 가정해 보겠습니다.

Color argb = Color.FromARGB(127, 69, 12, 255); //Light Urple.

기존 색상 위에 이것을 칠하면 색상이 혼합됩니다.따라서 흰색과 혼합하면 결과 색상은 다음과 같습니다. Color.FromARGB(255, 162, 133, 255);

솔루션은 다음과 같이 작동해야 합니다.

Color blend = Color.White; 
Color argb = Color.FromARGB(127, 69, 12, 255); //Light Urple.      
Color rgb = ToRGB(argb, blend); //Same as Color.FromARGB(255, 162, 133, 255);

무엇인가요 ToRGB구현?

도움이 되었습니까?

해결책

그것은 ~라고 불린다 알파 블렌딩.

의사코드에서는 배경색(블렌드)이 항상 255개의 알파를 갖는다고 가정합니다.또한 알파가 0-255라고 가정합니다.

alpha=argb.alpha()
r = (alpha/255)*argb.r() + (1 - alpha/255)*blend.r()
g = (alpha/255)*argb.g() + (1 - alpha/255)*blend.g()
b = (alpha/255)*argb.b() + (1 - alpha/255)*blend.b()

메모:언어에 따라 부동 소수점/정수 연산 및 반올림 문제에 대해 좀 더 주의해야 할 수도 있습니다.그에 따라 중간체를 캐스팅

다음을 추가하도록 편집되었습니다.

알파가 255인 배경색이 없으면 대수학이 훨씬 더 복잡해집니다.나는 이전에 그것을 해본 적이 있으며 독자들에게 남겨진 재미있는 연습입니다(정말 알고 싶다면 다른 질문을 하십시오 :).

즉, A를 블렌딩한 다음 B를 블렌딩하는 것과 마찬가지로 C가 배경에 블렌딩되는 색상은 무엇입니까?이는 A+B(B+A와 동일하지 않음)를 계산하는 것과 비슷합니다.

다른 팁

나는 이것이 오래된 스레드라는 것을 알고 있지만 이것을 추가하고 싶습니다:

Public Shared Function AlphaBlend(ByVal ForeGround As Color, ByVal BackGround As Color) As Color
    If ForeGround.A = 0 Then Return BackGround
    If BackGround.A = 0 Then Return ForeGround
    If ForeGround.A = 255 Then Return ForeGround
    Dim Alpha As Integer = CInt(ForeGround.A) + 1
    Dim B As Integer = Alpha * ForeGround.B + (255 - Alpha) * BackGround.B >> 8
    Dim G As Integer = Alpha * ForeGround.G + (255 - Alpha) * BackGround.G >> 8
    Dim R As Integer = Alpha * ForeGround.R + (255 - Alpha) * BackGround.R >> 8
    Dim A As Integer = ForeGround.A

    If BackGround.A = 255 Then A = 255
    If A > 255 Then A = 255
    If R > 255 Then R = 255
    If G > 255 Then G = 255
    If B > 255 Then B = 255

    Return Color.FromArgb(Math.Abs(A), Math.Abs(R), Math.Abs(G), Math.Abs(B))
End Function

public static Color AlphaBlend(Color ForeGround, Color BackGround)
{
    if (ForeGround.A == 0)
        return BackGround;
    if (BackGround.A == 0)
        return ForeGround;
    if (ForeGround.A == 255)
        return ForeGround;

    int Alpha = Convert.ToInt32(ForeGround.A) + 1;
    int B = Alpha * ForeGround.B + (255 - Alpha) * BackGround.B >> 8;
    int G = Alpha * ForeGround.G + (255 - Alpha) * BackGround.G >> 8;
    int R = Alpha * ForeGround.R + (255 - Alpha) * BackGround.R >> 8;
    int A = ForeGround.A;

    if (BackGround.A == 255)
        A = 255;
    if (A > 255)
        A = 255;
    if (R > 255)
        R = 255;
    if (G > 255)
        G = 255;
    if (B > 255)
        B = 255;

    return Color.FromArgb(Math.Abs(A), Math.Abs(R), Math.Abs(G), Math.Abs(B));
}

이 사전 렌더링을 알 필요가 없다면 언제든지 getpixel의 win32 메서드를 사용할 수 있다고 생각합니다.

메모:Inet 접속 없이 미주리 주 한가운데에서 iPhone으로 타이핑을 하고 있습니다.실제 win32 예제를 찾아보고 이에 상응하는 .net이 있는지 확인합니다.

누구든지 위에 게시된 (우수한) 답변을 사용하고 싶지 않은 경우 이 링크를 통해 .Net에서 픽셀의 색상 값을 얻을 수 있습니다. MSDN 예

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top