したがって、(a,r,g,b) を (r1,g1,b1) の上に置くと (R1,G1,B1) が得られ、(r2,g2,b2) の上に置くと (R2,G2) が得られることがわかります。 、B2)。言い換えると、ここでは、a の範囲が 0 から 1 の単位で作業します。(1-a)r1+ar=R1、(1-a)r2+ar=R2 などです。この 2 つを引いて、(1-a)(r1-r2)=R1-R2 を取得し、したがって a=1-(R1-R2)/(r1-r2) を取得します。aがわかれば、他のすべてを解決できます。
{R,G,B} の 3 つすべてに対してその計算を実行して得られる a の値を実際に計算し、それらまたは何かを平均して、丸め誤差の影響を減らす必要があります。実際、a = 1 - [(R1-R2)sign(r1-r2) + (G1-G2)sign(g1-g2) + (B1-B2)sign(b1-b2)] を取ることをお勧めします。 / (|r1-r2|+|g1-g2|+|b1-b2)、これはより信頼性の高い色をより高く重み付けすることになります。
たとえば、r = (R1-(1-a)r1)/a = (R2-(1-a)r2)/a となります。これら 2 つは、a、r、g、b に無限精度の値がある場合は等しくなりますが、実際にはわずかに異なる場合があります。それらの平均: r = [(R1+R2)-(1-a)(r1+r2)]/2a。
a の値がたまたま非常に小さい場合、r、g、b についてかなり信頼できない情報しか得られません。(a=0 の制限では、まったく情報が得られず、それについて何もできないことは明らかです。) 0..255 の範囲外の数値を取得する可能性があります。クリッピングよりもうまくできると思います。
特定の例でどのように機能するかを次に示します。(r1,g1,b1)=(0,0,0); (r2,g2,b2)=(255,255,255); (R1、G1、B1)=(0,0,128); (R2、G2、B2)=(127,127,255)。したがって、a = 1 - [127+127+127]/[255+255+255] = 128/255 となり、これは a の実際に可能な 256 の値の 1 つです。(そうでない場合は、おそらくこの段階で丸めるべきです。)
ここで r = (127-255*127/255)*255/256 = 0; 同様に g = 0; b = (383-255*127/255)*255/256 = 255.
したがって、ARGB カラーは 80,00,00,FF でした。