[image] 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로 변환하고 싶었고 다음은 예상대로 작동했습니다.

rgbImage = cv2.cvtColor(npimage, cv2.COLOR_RGBA2RGB)


답변

이것은 사용하는 색 공간에 따라 다릅니다. RGBA가 미리 곱해진 색상 공간에 있고 반투명 한 경우 올바른 RGB 색상을 얻으려면 알파를 나눠야합니다. 색상이 미리 곱해지지 않은 색상 공간에 있으면 알파 채널을 버릴 수 있습니다.


답변

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;
}


답변