RGBA 색상을 RGB로 변환


80

RGBA 색상 튜플 (예 : 96, 96, 96, 202)을 해당 RGB 색상 튜플로 변환하는 방법은 무엇입니까?

편집하다:

내가 원하는 것은 흰색 배경에 시각적으로 RGBA 튜플과 가장 유사한 RGB 값을 얻는 것입니다.


3
(96,96,96)이 아닐까요?
Lazarus

24
배경 픽셀의 색상에 따라 다릅니다.
Frank Bollack 2010 년

5
알파 채널 만 제거 하시겠습니까? 아니면 RGBA를 (예) 흰색 배경 위에 겹쳐서 RGB 결과를 원하십니까?
Ben James

1
알파 컴포지션에 대한 자세한 내용은 유명한 논문 "디지털 이미지 합성"(Porter 및 Duff 저)을 읽어보십시오. keithp.com/~keithp/porterduff
kusma

Andras Zoltan과 hkurabko의 대답은 반대쪽을 계산하는데도 유용합니다. 다양한 알파 블렌드 색상이 있고 원래 배경 (매트)이있는 경우 원래 RGBA 색상을 계산할 수 있습니다. 동안)
nacho4d

답변:


90

요하네스의 대답은 그가 옳기 때문에 찬성했습니다.

* 내 원래 답변이 정확하지 않다는 몇 가지 의견이 제기되었습니다. 알파 값이 정상에서 반전되면 작동했습니다. 그러나 정의에 따라 이것은 대부분의 경우 작동하지 않습니다. 따라서 정상적인 경우에 맞게 아래 공식을 업데이트했습니다. 이것은 아래 @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로 수정하십시오.


9
질문 편집에 비추어 볼 때 이것은 매우 정확하고 좋은 대답입니다. 나는 :) 광산을 삭제하고 더 나은 방법 사항을 설명하기 때문에, 당신에게 거품을 희망
조이

이 대답은 배경색이 rgba가 아니라 rgb라고 가정한다고 생각합니다.
레오

이것은 RGBA (0,0,0,1)이 완전히 불투명 한 검정색이라는 점을 고려하면 드문 경우입니다. 그러나 주어진 알고리즘을 사용하면 완전히 투명한 검정색이됩니다. 이를 반영하기 위해 알고리즘을 재정렬하면 더 유용한 리소스와 질문에 대한 더 나은 답변이 될 것이라고 생각합니다.
Bryan Rayner 2014

1
@BryanRayner가 내 대답에 몇 가지 수정 사항을 추가했습니다. 이 답변에 대한 찬성표를 정기적으로 얻고 있으며, 일부 사람들이 알고리즘을 직접 반전해야하는 경우이를 찾을 수 있습니다. 더 완전하다면 더 좋을 것입니다. 감사.
Andras Zoltan 2014

2
여전히 관심이있는 사람이라면이 JSBin을 사용하여 색상이 변형되는 것을 볼 수 있습니다. 또한 javacript 함수로 사용할 준비가되었습니다. 매트 개념을 이해하지 못하기 때문에 BGColor를 흰색으로 사용했습니다 (죄송합니다!). 링크는 다음과 같습니다 : jsbin.com/qocixeh/edit?html,js,console,output 및 요점 : gist.github.com/vladimirbrasil/bd139851ff757a1c8cb46fac93e733eb 도움이 되기를 바랍니다 . 답변 해 주셔서 감사합니다!
Vladimir Brasil

40

음 ...에 관하여

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)으로 변경됩니다.


나는 당신이 옳다고 믿습니다. Wikipedia와 Andras Zoltan의 대답은 약간 다릅니다.
nacho4d

1
동의합니다. @Andras Zoltan이 아닌이 버전을 사용합니다. 테스트 시나리오의 경우 두 공식을 모두 사용하여 배경 rgb (255,255,255)에서 rgba (0,0,0, .7)을 변환합니다. hkurabko의 forumala가 정답을 명확하게 생성합니다.
Ryre 2011-07-29

4
Andras는 0 알파를 불투명으로, 255를 투명으로 정의하는 반면 CSS는 반대 방식으로 정의합니다. 이 답변은 CSS의 알파 정의와 함께 작동합니다.
Casey Chu

1
+1 이것은 OpenGL, SDL, 그래픽 편집기와 같은 알파 (0 = 투명)의 가장 일반적인 정의와 함께 작동합니다.
DLight

+1-그리고 이에 따라 알파가 '올바른 방법'인 작업에 대한 내 답변을 업데이트했습니다. 아이러니하게도이 작업을 수행하기 위해 내 솔루션을 사용하려고 시도한 결과, 내 원래 답변이 자체적으로 의미가 있었지만 대부분의 응용 프로그램에서 실제로 작동하지 않았다는 데 동의합니다.
Andras Zoltan 2015 년

9

제 경우에는 RGBA 이미지를 RGB로 변환하고 싶었고 다음은 예상대로 작동했습니다.

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

5

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


1

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

sass에서는 다음을 사용할 수 있습니다.mix($color, white, $alpha*100)
S.Serpooshan

1

다음은 몇 가지 자바 코드입니다 (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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.