因此,您知道将 (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)。一旦你知道了一个,你就可以解决其他所有问题。
您实际上应该计算从对所有三个 {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。如果 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 个实际可能值之一。(如果不是,我们可能应该在这个阶段对其进行舍入。)
现在 r = (127-255*127/255)*255/256 = 0; 同样 g = 0; b = (383-255*127/255)*255/256 = 255。
所以我们的 ARGB 颜色是 80,00,00,FF。