RGB值的加色混合算法

RGB值的加色混合算法

我正在寻找一种算法来为RGB值进行加色混合。

是否像将RGB值一起添加到最大值256一样简单?

(r1, g1, b1) + (r2, g2, b2) =
    (min(r1+r2, 256), min(g1+g2, 256), min(b1+b2, 256))


万千封印
浏览 1358回答 3
3回答

婷婷同学_

这取决于你想要什么,它可以帮助看看不同方法的结果。如果你想红色+黑色=红色红色+绿色=黄色红色+绿色+蓝色=白色红+白=白 黑+白=白然后添加一个夹子工程(例如min(r1 + r2, 255))这更像你提到的灯光模型。如果你想红色+黑色=深红色红色+绿色=深黄色红色+绿色+蓝色=深灰色红+白=粉红色黑+白=灰那么你需要对这些值进行平均(例如(r1 + r2) / 2)这对于减轻/变暗颜色和创建渐变效果更好。

白衣非少年

要使用Alpha通道进行混合,您可以使用以下公式:r = new Color();r.A = 1 - (1 - fg.A) * (1 - bg.A);if (r.A < 1.0e-6) return r; // Fully transparent -- R,G,B not importantr.R = fg.R * fg.A / r.A + bg.R * bg.A * (1 - fg.A) / r.A;r.G = fg.G * fg.A / r.A + bg.G * bg.A * (1 - fg.A) / r.A;r.B = fg.B * fg.A / r.A + bg.B * bg.A * (1 - fg.A) / r.A;fg是油漆的颜色。bg是背景。r是产生的颜色。1.0e-6只是一个非常小的数字,以弥补舍入误差。注意:此处使用的所有变量都在[0.0,1.0]范围内。如果要使用[0,255]范围内的值,则必须除以255或乘以255。例如,50%绿色之上的50%红色:// background, 50% greenvar bg = new Color { R = 0.00, G = 1.00, B = 0.00, A = 0.50 };// paint, 50% redvar fg = new Color { R = 1.00, G = 0.00, B = 0.00, A = 0.50 };// The resultvar r = new Color();r.A = 1 - (1 - fg.A) * (1 - bg.A); // 0.75r.R = fg.R * fg.A / r.A + bg.R * bg.A * (1 - fg.A) / r.A; // 0.67r.G = fg.G * fg.A / r.A + bg.G * bg.A * (1 - fg.A) / r.A; // 0.33r.B = fg.B * fg.A / r.A + bg.B * bg.A * (1 - fg.A) / r.A; // 0.00产生的颜色为:(0.67, 0.33, 0.00, 0.75)或75%棕色(或深橙色)。你也可以反转这些公式:var bg = new Color();if (1 - fg.A <= 1.0e-6) return null; // No result -- 'fg' is fully opaqueif (r.A - fg.A < -1.0e-6) return null; // No result -- 'fg' can't make the result more transparentif (r.A - fg.A < 1.0e-6) return bg; // Fully transparent -- R,G,B not importantbg.A = 1 - (1 - r.A) / (1 - fg.A);bg.R = (r.R * r.A - fg.R * fg.A) / (bg.A * (1 - fg.A));bg.G = (r.G * r.A - fg.G * fg.A) / (bg.A * (1 - fg.A));bg.B = (r.B * r.A - fg.B * fg.A) / (bg.A * (1 - fg.A));要么var fg = new Color();if (1 - bg.A <= 1.0e-6) return null; // No result -- 'bg' is fully opaqueif (r.A - bg.A < -1.0e-6) return null; // No result -- 'bg' can't make the result more transparentif (r.A - bg.A < 1.0e-6) return bg; // Fully transparent -- R,G,B not importantfg.A = 1 - (1 - r.A) / (1 - bg.A);fg.R = (r.R * r.A - bg.R * bg.A * (1 - fg.A)) / fg.A;fg.G = (r.G * r.A - bg.G * bg.A * (1 - fg.A)) / fg.A;fg.B = (r.B * r.A - bg.B * bg.A * (1 - fg.A)) / fg.A;公式将计算背景或油漆颜色必须产生给定的结果颜色。如果您的背景不透明,结果也将是不透明的。然后,前景色可以采用具有不同α值的一系列值。对于每个通道(红色,绿色和蓝色),您必须检查哪个alpha范围会产生有效值(0 - 1)。
打开App,查看更多内容
随时随地看视频慕课网APP