你知道将 (a,r,g,b) 放在 (r1,g1,b1) 上会得到 (R1,G1,B1),将它放在 (r2,g2,b2) 上会得到 (R2,G2,B2)。 换句话说 - 顺便提一下,我将在单位为0至1的区间内工作 - 你知道(1-a)r1+ar=R1,(1-a)r2+ar=R2,等等。 将这两个式子相减:得到 (1-a)(r1-r2)=R1-R2,因此 a=1-(R1-R2)/(r1-r2)。 一旦你知道 a,你就可以算出其他所有东西。
事实上,你应该计算出从对 {R、G、B} 做这个计算而得到的所有 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。 如果你有无限精度的值,这两个值将相等,但在实践中它们可能略有不同。 取平均值: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,这恰好是256个实际可能的 a 值之一。(如果不是这样,我们应该在这个阶段四舍五入。)
现在r=(127-255*127/255)*255/256=0;同理,g=0;并且 b=(383-255*127/255)*255/256=255。
因此,我们的 ARGB 颜色是80,00,00,FF。