怎么样计算两种色光混合后的R、G、B值

.Net技术 码拜 9年前 (2016-05-23) 1930次浏览
第一种色光的颜色值为r1,g1,b1,第二种色光的颜色为r2,g2,b2,那么两种混合后的颜色RGB各是多少?有效取值范围为0到255。
怎么样计算两种色光混合后的R、G、B值
解决方案

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

引用:

从你的示例图看,颜色的各个分量相加就可以了:
r1+r2, g1+g2, b1+b2
但是,这种方式混合红色和黑色,不能得到暗红,得到的还是红色:
255+0, 0+0, 0+0
一种得到暗红的简单方式可以是平均:
(r1+r2)/2, (g1+g2)/2, (b1+b2)/2
但这种方式得不到你的示例图,例如中间白色部分将变成灰色。
当然还有其它种种的方法。因此,你要先确定你要的是什么。

题主问的是光混合.
光是不存在黑光的
你能否和调色混合弄混了?

5

引用:

这样的计算方法能否真实?
R=R1+R2-R1*R2/255
G=G1+G2-G1*G2/255
B=B1+B2-B1*B2/255
按照这样的算法,一束红光与一束黄光垒加,黄光将湮没红光,真实情况是这样吗?

题主给出了三基色混光的图
可以看出,红+绿=黄
那么可以说黄是包含红的
黄和红混光之后,就是应该泯没红光
当然真实情况不仅要看2种光的色调,还要看各自的光强度,假如黄光很弱,而红光很强,整体应该表现为红色,黄色基本看不出
所以只用RGB,而A不参与计算,跟真实情况肯定是有出入的

5

一束红光与一束黄光垒加,黄光将湮没红光
事实上是黄偏红,应该叫着什么橙
光的混合是一个物理现象,不能用简单的数学式表达
所以 PS 不就提供了十多种混色方案供你模拟逼真的效果,并可产生自然界并不存在的色彩效果

5

r1,g1,b1,   r2,g2,b2
先试试  (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 计算混色结果
不过学艺不精,把握不好度。献丑了
怎么样计算两种色光混合后的R、G、B值
下面文本框列分别是 左色、混合色、右色
左边从上往下依次是 左色、混合色、右色 的 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();

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明怎么样计算两种色光混合后的R、G、B值
喜欢 (0)
[1034331897@qq.com]
分享 (0)