RGBA 색상 튜플 (예 : 96, 96, 96, 202)을 해당 RGB 색상 튜플로 변환하는 방법은 무엇입니까?
편집하다:
내가 원하는 것은 흰색 배경에 시각적으로 RGBA 튜플과 가장 유사한 RGB 값을 얻는 것입니다.
RGBA 색상 튜플 (예 : 96, 96, 96, 202)을 해당 RGB 색상 튜플로 변환하는 방법은 무엇입니까?
편집하다:
내가 원하는 것은 흰색 배경에 시각적으로 RGBA 튜플과 가장 유사한 RGB 값을 얻는 것입니다.
답변:
요하네스의 대답은 그가 옳기 때문에 찬성했습니다.
* 내 원래 답변이 정확하지 않다는 몇 가지 의견이 제기되었습니다. 알파 값이 정상에서 반전되면 작동했습니다. 그러나 정의에 따라 이것은 대부분의 경우 작동하지 않습니다. 따라서 정상적인 경우에 맞게 아래 공식을 업데이트했습니다. 이것은 아래 @hkurabko의 답변과 같습니다 *
그러나 좀 더 구체적인 대답은 불투명 한 배경색 (또는 '매트'라고 함)을 기반으로 알파 값을 실제 색상 결과에 통합하는 것입니다.
이에 대한 알고리즘이 있습니다 ( 이 위키 백과 링크에서) :
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로 변환하고 싶었고 다음은 예상대로 작동했습니다.
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);
}
mix($color, white, $alpha*100)
다음은 몇 가지 자바 코드입니다 (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;
}