用于在颜色空间中找到两个颜色之间的颜色的算法

当混合蓝色和黄色油漆,结果是某种绿色。

我有两个rgb颜色:

蓝色=(0,255)

和黄色=(255,255,0)

什么是找到rgb颜色的混合两种颜色的结果,因为他们会出现在使用油漆的算法是什么?从算法得到的颜色不必非常准确。对于上面的例子,它只需要看起来像某种绿色。

提前致谢。

编辑:这个功能,写在Go,为我工作,基于LaC的答案。

func paintMix(c1,c2 image.RGBAColor) image.RGBAColor { 
    r := 255 - ((255 - c1.R) + (255 - c2.R))
    g := 255 - ((255 - c1.G) + (255 - c2.G))
    b := 255 - ((255 - c1.B) + (255 - c2.B))
    return image.RGBAColor{r,g,b,255}
}

编辑#2所有想到的是混合青色和黄色,蓝色和黄色之间的混合变成黑色,这似乎不对。我还在寻找一个工作算法。

编辑#3这是Go中一个完整的工作示例,使用HLS颜色空间:http://go.pastie.org/1976031.感谢Mark Ransom。

编辑#4似乎更好的颜色混合的方式是使用Kubelka-Munk方程

解决方法

油漆工程通过吸收。你从白光(255,255)开始,并乘以吸收系数。

蓝色油漆吸收所有撞击它的红色和绿色光。

黄色油漆吸收所有撞击它的蓝色光。

一个完美的世界里,这意味着结合黄色和蓝色的油漆将导致黑色油漆,或者最多是泥泞的灰色。在实践中,“蓝色”油漆有偏向绿色,所以你得到一个泥泞的绿色。我从来没有见过一个混合黄色和蓝色,产生令人满意的绿色的例子。维基百科进入了这个过程的一些复杂性:http://en.wikipedia.org/wiki/Primary_color#Subtractive_primaries

我想你真正要求的是如何沿着色轮内插颜色。这应该独立于颜色是吸收性的,如在油漆中,或发射性在RGB显示器。

编辑:通过在HSL颜色空间中工作,你可以得到你想要的那种结果。下面是一些Python中的代码实现的算法;平均色调是棘手的,是基于我for averaging angles以前的答案。

from colorsys import rgb_to_hls,hls_to_rgb
from math import sin,cos,atan2,pi

def average_colors(rgb1,rgb2):
    h1,l1,s1 = rgb_to_hls(rgb1[0]/255.,rgb1[1]/255.,rgb1[2]/255.)
    h2,l2,s2 = rgb_to_hls(rgb2[0]/255.,rgb2[1]/255.,rgb2[2]/255.)
    s = 0.5 * (s1 + s2)
    l = 0.5 * (l1 + l2)
    x = cos(2*pi*h1) + cos(2*pi*h2)
    y = sin(2*pi*h1) + sin(2*pi*h2)
    if x != 0.0 or y != 0.0:
        h = atan2(y,x) / (2*pi)
    else:
        h = 0.0
        s = 0.0
    r,b = hls_to_rgb(h,l,s)
    return (int(r*255.),int(g*255.),int(b*255.))

>>> average_colors((255,0),(0,255))
(0,111)
>>> average_colors((255,0)

注意,由于上述原因,这个答案不能模拟油漆混合。相反,它给出了直观混合的颜色,这不是基于任何物理世界的现实。

相关文章

Css3如何实现鼠标移上变长特效?(图文+视频)
css3怎么实现鼠标悬停图片时缓慢变大效果?(图文+视频)
jquery如何实现点击网页回到顶部效果?(图文+视频)
css3边框阴影效果怎么做?(图文+视频)
css怎么实现圆角边框和圆形效果?(图文+视频教程)
Css3如何实现旋转移动动画特效