第一种色光的颜色值为r1,g1,b1,第二种色光的颜色为r2,g2,b2,那么两种混合后的颜色RGB各是多少?有效取值范围为0到255。
解决方案
5
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); }
5
题主问的是光混合.
光是不存在黑光的
你能否和调色混合弄混了?
5
题主给出了三基色混光的图
可以看出,红+绿=黄
那么可以说黄是包含红的
黄和红混光之后,就是应该泯没红光
当然真实情况不仅要看2种光的色调,还要看各自的光强度,假如黄光很弱,而红光很强,整体应该表现为红色,黄色基本看不出
所以只用RGB,而A不参与计算,跟真实情况肯定是有出入的
5
一束红光与一束黄光垒加,黄光将湮没红光
事实上是黄偏红,应该叫着什么橙
光的混合是一个物理现象,不能用简单的数学式表达
所以 PS 不就提供了十多种混色方案供你模拟逼真的效果,并可产生自然界并不存在的色彩效果
事实上是黄偏红,应该叫着什么橙
光的混合是一个物理现象,不能用简单的数学式表达
所以 PS 不就提供了十多种混色方案供你模拟逼真的效果,并可产生自然界并不存在的色彩效果
5
r1,g1,b1, r2,g2,b2
先试试 (r1+r2)/2 (g1+g2)/2 (b1+b2)/2
先试试 (r1+r2)/2 (g1+g2)/2 (b1+b2)/2
5
本人研究的光色叠加计算公式
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]); }
5
提供一种算法,各分量的和小于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; } }
5
应该用 HSB 计算混色结果
不过学艺不精,把握不好度。献丑了
下面文本框列分别是 左色、混合色、右色
左边从上往下依次是 左色、混合色、右色 的 HSB 值
混合色采用了 Photoshop 的 Screen 滤色 混合模式:C=1-(1-A)*(1-B)
右边是 左色 + 右色 的 HSB 和 RGB 值 和例图
由于是 vs2010 写的项目,这里又不能发附件。所以只贴出本人的 HSB 类(两个功能:重载 + 运算符、HSB 到 RGB 的转换)
不过学艺不精,把握不好度。献丑了
下面文本框列分别是 左色、混合色、右色
左边从上往下依次是 左色、混合色、右色 的 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();