programing

알파 블렌딩 양을 지정하여 RGB 색상을 계산하는 방법은 무엇입니까?

sourcetip 2021. 1. 17. 12:40
반응형

알파 블렌딩 양을 지정하여 RGB 색상을 계산하는 방법은 무엇입니까?


화면에서 가리키는 곳마다 픽셀 RGB 값을 가져 오는 색상 선택기를 작성 중입니다. 선택한 색상에 이미 알파 값이 있음을 지정하는 옵션도 갖고 싶습니다. 결과 색상을 어떻게 계산할 수 있는지 궁금합니다.

예를 들면 :

결과 픽셀 색상은 240,247,249이지만 원래 색상의 불투명도가 10 %이고 흰색 (255,255,255) 배경 위에 있다는 것을 알고 있습니다. 원래 RGB 값을 계산하기위한 계산은 무엇입니까?


표준 혼합 방정식은 다음과 같습니다.

out = alpha * new + (1 - alpha) * old

여기서 out, newoldRGB 색이며, alpha범위 [0,1]에서 부동 소수점 수이다.

따라서 (빨간색) :

240 = 0.1 * newR + 0.9 * 255

를 해결 newR하면 다음을 얻을 수 있습니다.

newR = (240 - 0.9 * 255) / 0.1

105로 평가됩니다. 다른 구성 요소에 대해 반복하면 완료됩니다.


r, g, b가 아닌 알파를 어떻게 알 수 있는지 궁금합니다. 사용 된 혼합 모드가 모든 경우에 Normal이 아니면 원래 값을 계산할 수 없습니다. 모든 것이 이상적이라 할지라도 원본에서 결과로 이동할 때 이미 일부 반올림이 발생했기 때문에 근사치 만 가능합니다. 또한 결과에서 원본으로 되돌릴 때 반올림해야 할 가능성이 높습니다.

블렌딩 모드가 Normal이면 너무 어렵지 않습니다 :-)

opacity*original + (1-opacity)*background = resulting pixel

original R = (resulting R - ((1-opacity)*background R)) / opacity.
original G = (resulting G - ((1-opacity)*background G)) / opacity.
original B = (resulting B - ((1-opacity)*background B)) / opacity.

불투명도가 (alpha/100).


다음 의사 코드는 문제를 해결합니다.

    CalculateSolidColorFromTransparentColor(Color color, Color background)
    {
        alpha = color.A / 255;
        oneminusalpha = 1 - alpha;

        newR = ((color.R * alpha) + (oneminusalpha * background.R));
        newG = ((color.G * alpha) + (oneminusalpha * background.G));
        newB = ((color.B * alpha) + (oneminusalpha * background.B));
    }

입력 색상 및 배경에는 [0..255]로 표현 된 값이 있습니다.

참조 URL : https://stackoverflow.com/questions/746899/how-to-calculate-an-rgb-colour-by-specifying-an-alpha-blending-amount

반응형