RGBA 색상을 RGB로 변환
RGBA 색상 튜플 (예 : 96, 96, 96, 202)을 해당 RGB 색상 튜플으로 변환하는 방법은 무엇입니까?
편집하다:
내가 원하는 것은 흰색 배경에 시각적으로 RGBA 튜플과 가장 유사한 RGB 값을 얻는 것입니다.
요하네스의 대답은 그가 옳기 때문에 찬성했습니다.
* 내 원래 답변이 정확하지 않다는 몇 가지 의견이 제기되었습니다. 알파 값이 정상에서 반전되면 작동했습니다. 그러나 정의에 따라 이것은 대부분의 경우 작동하지 않습니다. 따라서 정상적인 경우에 맞게 아래 공식을 업데이트했습니다. 이것은 아래 @hkurabko의 답변과 같습니다 *
그러나 더 구체적인 답변은 불투명 한 배경색 (또는 '매트'라고 함)을 기반으로 알파 값을 실제 색상 결과에 통합합니다.
이에 대한 알고리즘이 있습니다 ( 이 위키 백과 링크에서) :
- RGBA 값을 모두 0과 1 사이에 있도록 정규화하십시오. 각 값을 255로 나누면됩니다. 결과를라고 부를 것
Source
입니다. - 무광택 색상 (검은 색, 흰색 등)도 표준화합니다. 결과를
BGColor
Note 라고 부를 것입니다. 배경색도 투명하다면이 작업에 대한 소스 RGB를 얻으려면 먼저 해당 프로세스를 반복해야합니다 (다시 매트 선택). 이제 변환은 다음과 같이 정의됩니다 (여기에 완전한 유사 코드에서!).
Source => Target = (BGColor + Source) = Target.R = ((1 - Source.A) * BGColor.R) + (Source.A * Source.R) Target.G = ((1 - Source.A) * BGColor.G) + (Source.A * Source.G) Target.B = ((1 - Source.A) * BGColor.B) + (Source.A * Source.B)
최종 0-255 값을 얻으려면 Target
모든 정규화 된 값에 255를 곱하고 결합 된 값이 1.0을 초과하는 경우 255로 제한해야합니다 (이는 과다 노출이며이를 처리하는 더 복잡한 알고리즘이 있습니다. 전체 이미지 처리 등).
편집 : 귀하의 질문에서 흰색 배경을 원한다고 말했습니다.이 경우 BGColor를 255,255,255로 수정하십시오.
음 ...에 관하여
http://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending
Andras Zoltan이 제공하는 솔루션은 다음과 같이 약간 변경되어야합니다.
Source => Target = (BGColor + Source) =
Target.R = ((1 - Source.A) * BGColor.R) + (Source.A * Source.R)
Target.G = ((1 - Source.A) * BGColor.G) + (Source.A * Source.G)
Target.B = ((1 - Source.A) * BGColor.B) + (Source.A * Source.B)
이 변경된 버전은 저에게 잘 작동합니다. 매트 rgb (ff, ff, ff)가있는 버전 rgba (0,0,0,0)은 rgb (0,0,0)으로 변경됩니다.
이것은 사용하는 색 공간에 따라 다릅니다. RGBA가 미리 곱해진 색상 공간에 있고 반투명 한 경우 올바른 RGB 색상을 얻으려면 알파를 나누어야합니다. 색상이 미리 곱해지지 않은 색상 공간에 있으면 알파 채널을 버릴 수 있습니다.
제 경우에는 RGBA 이미지를 RGB로 변환하고 싶었고 다음은 예상대로 작동했습니다.
rgbImage = cv2.cvtColor(npimage, cv2.COLOR_RGBA2RGB)
Andras '및 hkurabko의 답변에 따른 편리한 SASS 기능이 있습니다.
@function rgba_blend($fore, $back) {
$ored: ((1 - alpha($fore)) * red($back) ) + (alpha($fore) * red($fore));
$ogreen: ((1 - alpha($fore)) * green($back) ) + (alpha($fore) * green($fore));
$oblue: ((1 - alpha($fore)) * blue($back) ) + (alpha($fore) * blue($fore));
@return rgb($ored, $ogreen, $oblue);
}
용법:
$my_color: rgba(red, 0.5); // build a color with alpha for below
#a_div {
background-color: rgba_blend($my_color, white);
}
다음은 몇 가지 자바 코드입니다 (Android API 24에서 작동).
//int rgb_background = Color.parseColor("#ffffff"); //white background
//int rgba_color = Color.parseColor("#8a000000"); //textViewColor
int defaultTextViewColor = textView.getTextColors().getDefaultColor();
int argb = defaultTextViewColor;
int alpha = 0xFF & (argb >> 24);
int red = 0xFF & (argb >> 16);
int green = 0xFF & (argb >> 8);
int blue = 0xFF & (argb >> 0);
float alphaFloat = (float)alpha / 255;
String colorStr = rgbaToRGB(255, 255, 255, red, green, blue, alphaFloat);
함수:
protected String rgbaToRGB(int rgb_background_red, int rgb_background_green, int rgb_background_blue,
int rgba_color_red, int rgba_color_green, int rgba_color_blue, float alpha) {
float red = (1 - alpha) * rgb_background_red + alpha * rgba_color_red;
float green = (1 - alpha) * rgb_background_green + alpha * rgba_color_green;
float blue = (1 - alpha) * rgb_background_blue + alpha * rgba_color_blue;
String redStr = Integer.toHexString((int) red);
String greenStr = Integer.toHexString((int) green);
String blueStr = Integer.toHexString((int) blue);
String colorHex = "#" + redStr + greenStr + blueStr;
//return Color.parseColor(colorHex);
return colorHex;
}
참고 URL : https://stackoverflow.com/questions/2049230/convert-rgba-color-to-rgb
'program story' 카테고리의 다른 글
오버레이에 CSS 유리 / 흐림 효과를 적용하려면 어떻게해야합니까? (0) | 2020.10.24 |
---|---|
{this.props.children}은 무엇이며 언제 사용해야합니까? (0) | 2020.10.24 |
둘 이상의 Java 에이전트로 Java 프로그램을 시작하려면 어떻게합니까? (0) | 2020.10.23 |
태그 사이의 텍스트를 추출하는 Java 정규식 (0) | 2020.10.23 |
Python에서 키보드 이벤트를 생성하는 방법은 무엇입니까? (0) | 2020.10.23 |