画面上のどこからでもピクセルRGB値を取得するカラーピッカーを作成しています。また、選択した色が既にアルファ値を持っていることを指定するオプションも必要です。結果の色をどのように計算できるのかと思っています。
例えば:
結果のピクセルの色は240,247,249ですが、元の色は10%の不透明度を持ち、白(255,255,255)の背景の上にあったことを知っています。元のRGB値を計算するための計算は何ですか?
標準的な混合方程式は次のとおりです。
out = alpha * new + (1 - alpha) * old
ここで、out
、new
、およびold
はRGBカラー、alpha
は範囲[0,1]の浮動小数点数です。
だから、あなたは持っています(赤):
240 = 0.1 * newR + 0.9 * 255
newR
を解くと、次のようになります:
newR = (240 - 0.9 * 255) / 0.1
105と評価されます。他のコンポーネントについても繰り返します。これで完了です。
どのようにアルファ、r、g、bではなくアルファを知るのでしょうか...使用されるブレンドモードがすべての場合にNormalでない限り、元の値を計算することはできません。そして、すべてが理想的であっても、元から結果に進むときにおそらく既にいくつかの丸めが行われているため、近似することしかできません。また、結果から元の状態に戻る場合、ほとんどの場合、丸める必要があります。
ブレンディングモードが通常の場合、それほど難しくありません:-)
opacity*original + (1-opacity)*background = resulting pixel
original R = (resulting R - ((1-opacity)*background R)) / opacity.
original G = (resulting G - ((1-opacity)*background G)) / opacity.
original B = (resulting B - ((1-opacity)*background B)) / opacity.
不透明度は(alpha/100)
。
次の擬似コードは問題を解決します。
CalculateSolidColorFromTransparentColor(Color color, Color background)
{
alpha = color.A / 255;
oneminusalpha = 1 - alpha;
newR = ((color.R * alpha) + (oneminusalpha * background.R));
newG = ((color.G * alpha) + (oneminusalpha * background.G));
newB = ((color.B * alpha) + (oneminusalpha * background.B));
}
入力色と背景には[0..255]で表される値があることに注意してください。