RGBA カラー タプル、例 (96, 96, 96, 202) を対応する RGB カラー タプルに変換する方法は?
編集:
私が欲しいのは、白い背景で視覚的に RGBA タプルに最も似ている RGB 値を取得することです。
彼はそれについて正しいので、私はヨハネスの答えに賛成しました。
* 私の最初の回答が正しくないというコメントがいくつかありました。アルファ値が法線から反転された場合に機能しました。ただし、定義上、ほとんどの場合、これは機能しません。したがって、通常のケースで正しいように、以下の式を更新しました。これは、以下の@hkurabkoの回答と同じになります*
ただし、より具体的な答えは、不透明な背景色 (または「マット」と呼ばれる) に基づいて、アルファ値を実際の色の結果に組み込むことです。
これにはアルゴリズムがあります(このウィキペディアのリンクから):
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 で上限を設定してください (これは過度の露出であり、これを処理するより複雑なアルゴリズムがあります)。画像全体の処理など)。
編集: あなたの質問では、白い背景が欲しいと言っていました。その場合は、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 色を取得する必要があります。色が事前に乗算されていない色空間にある場合は、アルファ チャネルを破棄できます。
これは、Andras' と hkurabko's answer に従った便利な 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);
}
hkurabko の回答に従った Python 関数。
def rgba2rgb(rgba: tuple[int, int, int, float], background: tuple[int, int, int] = (255, 255, 255)):
return (
round(((1 - rgba[3]) * background[0]) + (rgba[3] * rgba[0])),
round(((1 - rgba[3]) * background[1]) + (rgba[3] * rgba[1])),
round(((1 - rgba[3]) * background[2]) + (rgba[3] * rgba[2])),
)