1. ホーム
  2. image

[解決済み] RGBAカラーをRGBに変換する

2022-03-08 23:03:50

質問

RGBAカラー・タプル、例えば(96, 96, 96, 202)を対応するRGBカラー・タプルに変換する方法は?

編集してください。

私が欲しいのは、白色の背景で視覚的にRGBAタプルに最も近いRGB値を取得することです。

どのように解決するのですか?

ヨハネスさんの回答が正しいので、upvoteしました。

* 私の最初の回答が正しくなかったというコメントがいくつか寄せられています。 アルファ値が正規値から反転している場合はうまくいきました。 しかし、定義上、これはほとんどの場合うまくいきません。 そこで、以下の数式を通常のケースで正しくなるように更新しました。 これは結局、以下の @hkurabko さんの答えと同じになります *。

しかし、より具体的な答えは、不透明な背景色(または「マット」と呼ばれる)に基づく実際の色の結果にアルファ値を組み入れることです。

このためのアルゴリズムがあります( これ wikipediaのリンク)。

  • RGBA 値がすべて 0 から 1 の間になるように正規化します - これを行うには、各値を 255 で割ります。 この結果を Source .
  • マットカラー(黒、白など)も正規化します。 この結果を BGColor - 背景色も透明である場合、この操作のためのソース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で上限を設定します(これは露出オーバーであり、画像全体の処理など、より複雑なアルゴリズムで対処します)。

EDIT: 質問の中で、白い背景にしたいと言っていますが、その場合は BGColor を 255,255,255 に固定します。