반응형
알파 블렌딩 양을 지정하여 RGB 색상을 계산하는 방법은 무엇입니까?
화면에서 가리키는 곳마다 픽셀 RGB 값을 가져 오는 색상 선택기를 작성 중입니다. 선택한 색상에 이미 알파 값이 있음을 지정하는 옵션도 갖고 싶습니다. 결과 색상을 어떻게 계산할 수 있는지 궁금합니다.
예를 들면 :
결과 픽셀 색상은 240,247,249이지만 원래 색상의 불투명도가 10 %이고 흰색 (255,255,255) 배경 위에 있다는 것을 알고 있습니다. 원래 RGB 값을 계산하기위한 계산은 무엇입니까?
표준 혼합 방정식은 다음과 같습니다.
out = alpha * new + (1 - alpha) * old
여기서 out
, new
및 old
RGB 색이며, 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]로 표현 된 값이 있습니다.
반응형
'programing' 카테고리의 다른 글
NuxtJS / Vuex | nuxtServerInit 및 fetchData 액션이 온 상태의 사용자를 채우지 않음 (0) | 2022.07.09 |
---|---|
Android Emulator로 인증해야하는 프록시 (0) | 2021.01.17 |
KCacheGrind에서 cProfile 결과 사용 (0) | 2021.01.17 |
장고 템플릿과 지역 트릭 (0) | 2021.01.17 |
프로젝트 별 (또는 파일별로) Xcode에서 들여 쓰기 설정을 지정할 수 있습니까? (0) | 2021.01.17 |