第一种色光的颜色值为r1,g1,b1,第二种色光的颜色为r2,g2,b2,那么两种混合后的颜色RGB各是多少?有效取值范围为0到255。

------解决思路----------------------
private uint ParseRGB(Color color)
{
return (uint)(((uint)color.B << 16)
------解决思路----------------------
(ushort)(((ushort)color.G << 8)
------解决思路----------------------
color.R));
}
private Color RGB(int color)
{
int r = 0xFF & color;
int g = 0xFF00 & color;
g >>= 8;
int b = 0xFF0000 & color;
b >>= 16;
return Color.FromArgb(r, g, b);
}
private Color myRGB(int color)
{
uint rgb1 = ParseRGB(Color.FromArgb(255, 0, 0));
uint rgb2 = ParseRGB(Color.FromArgb(0, 255, 0));
uint rgb3 = rgb1 + rgb2;
return RGB((int)rgb3);
}
------解决思路----------------------
楼主问的是光混合.
光是不存在黑光的
你是否和调色混合弄混了?
------解决思路----------------------
楼主给出了三基色混光的图
可以看出,红+绿=黄
那么可以说黄是包含红的
黄和红混光之后,就是应该泯没红光
当然真实情况不仅要看2种光的色调,还要看各自的光强度,如果黄光很弱,而红光很强,整体应该表现为红色,黄色基本看不出
所以只用RGB,而A不参与计算,跟真实情况肯定是有出入的
------解决思路----------------------
一束红光与一束黄光垒加,黄光将湮没红光
事实上是黄偏红,应该叫着什么橙
光的混合是一个物理现象,不能用简单的数学式表达
所以 PS 不就提供了十多种混色方案供你模拟逼真的效果,并可产生自然界并不存在的色彩效果
------解决思路----------------------
r1,g1,b1, r2,g2,b2
先试试 (r1+r2)/2 (g1+g2)/2 (b1+b2)/2
------解决思路----------------------
我研究的光色叠加计算公式
private Color AddColor(Color color, Color color_2)
{
int[] cv = new int[]{
color.R,color.G,color.B,
color_2.R,color_2.G,color_2.B,
0,0,0
};
for (int i = 0; i < 3; i++)
{
cv[i + 6] = 255 - (255 - cv[i + 0]) * (255 - cv[i + 3]) / 255;
}
return Color.FromArgb(cv[6], cv[7], cv[8]);
}
------解决思路----------------------
提供一种算法,各分量的和小于255则直接相加,有大于255的分量则相加后按比例缩小
class LightColor
{
Color color;
public Color Color1
{
get { return color; }
set { color = value; }
}
public LightColor() { }
public LightColor(Color color)
{
this.color = color;
}
public static LightColor operator +(LightColor lightColor1,LightColor lightColor2)
{
int red = lightColor1.color.R + lightColor2.color.R;
int green = lightColor1.color.G + lightColor2.color.G;
int blue = lightColor1.color.B + lightColor2.color.B;
int max = Math.Max(Math.Max(red, green), blue);
if (max > 255)
{
double f = 255.0 / max;
red = (int)(red * f);
green = (int)(green * f);
blue = (int)(blue * f);
}
LightColor lightColor = new LightColor(Color.FromArgb(red,green,blue));
return lightColor;
}
}
------解决思路----------------------
应该用 HSB 计算混色结果
不过学艺不精,把握不好度。献丑了

下面文本框列分别是 左色、混合色、右色
左边从上往下依次是 左色、混合色、右色 的 HSB 值
混合色采用了 Photoshop 的 Screen 滤色 混合模式:C=1-(1-A)*(1-B)
右边是 左色 + 右色 的 HSB 和 RGB 值 和例图
由于是 vs2010 写的项目,这里又不能发附件。所以只贴出我的 HSB 类(两个功能:重载 + 运算符、HSB 到 RGB 的转换)
class HSB
{
public float H; //色调
public float S; //饱和度
public float B; //亮度
public HSB()
{
H = 0;
S = 1;
B = 1;
}
public HSB(HSB hsb)
{
H = hsb.H;
S = hsb.S;
B = hsb.B;
}
public HSB(Color color)
{
H = color.GetHue();
S = color.GetSaturation();
B = color.GetBrightness();
}
public override string ToString()
{
return "H:" + H + " S:" + S + " B:" + B;
}
public static HSB operator +(HSB lhs, HSB rhs)
{
HSB result = new HSB(lhs);
var h1 = result.H;
var h2 = rhs.H;
if (rhs.H - h1 > 180) h1 += 360f;
result.H = (rhs.H - h1) / 2 + h1;
if (result.H == 360f) result.H = 0f;
result.S = rhs.S;
result.B = rhs.B * 2;
return result;
}
public Color ToColor()
{
double r = 0;
double g = 0;
double b = 0;
if (S == 0)
{
r = g = b = B;
}
else
{
// the color wheel consists of 6 sectors. Figure out which sector you're in.
double sectorPos = H / 60.0;
int sectorNumber = (int)(Math.Floor(sectorPos));
// get the fractional part of the sector
double fractionalSector = sectorPos - sectorNumber;
// calculate values for the three axes of the color.
double p = B * (1.0 - S);
double q = B * (1.0 - (S * fractionalSector));
double t = B * (1.0 - (S * (1 - fractionalSector)));
// assign the fractional colors to r, g, and b based on the sector the angle is in.
switch (sectorNumber)
{
case 0:
r = B;
g = t;
b = p;
break;
case 1:
r = q;
g = B;
b = p;
break;
case 2:
r = p;
g = B;
b = t;
break;
case 3:
r = p;
g = q;
b = B;
break;
case 4:
r = t;
g = p;
b = B;
break;
case 5:
r = B;
g = p;
b = q;
break;
}
}
var red = Convert.ToInt32(r * 255);
var green = Convert.ToInt32(g * 255);
var blue = Math.Abs(Convert.ToInt32(b * 255));
return Color.FromArgb(red, green, blue);
}
}
可单独使用,如
Color color = (new HSB(Color.FromArgb(100, 100, 220)) + new HSB(Color.Tomato)).ToColor();