我目前使用的是RGBW LED灯条 – 具体来说,我正在使用低成本的RGBW灯:灯由四个LED组成,每个LED都可以单独控制.
为了更清楚 – 我正在研究一些c#代码,它们应该检索当前选择的颜色并在UI中显示它,并使用户能够指定灯光的新颜色.为了设置颜色并检索它,我必须使用命令提供程序,使我能够通过Web服务发送和接收命令.
提供商使用RGBW颜色 – 使用红色,绿色,蓝色和白色四个组件.为了表示我界面上的当前灯光颜色,我想将服务返回的RGBW颜色转换为更标准的RGB / HSB方案.
搜索网页,我找到的唯一的颜色转换参考(根据我的理解,不包括rgb到rgbw转换的ac样本,必须有一些严重的错误)这篇文章显示了从HSI到RGBW的转换,这是与我需要的相反:link here
我正在寻找一些关于如何实现这种转换的见解(或者为什么不可能的简单解释).就我而言,从RGB到RGBW的转换是任意的 – 单个RGB值可以表示为多个RGBW值,但相反的转换应该是单义的.另请注意,虽然我使用的是c#,但也可以自由地引用其他语言的算法 – 语言不是问题,问题是我不知道数学做颜色转换.
解决方法
http://www.mirlab.org/conference_papers/International_Conference/ICASSP%202014/papers/p1214-lee.pdf
把你的LED想象成一个巨大的像素.奥利弗的回答使用了Wo = min(Ri,Gi,Bi),什么是计算上便宜而且正常工作.本文介绍了最小化功耗的其他替代方案,这对家庭自动化项目有利.我也参与了一个有OpenHAB,Arduino和RGBW LED的家庭自动化项目,一方面提出的替代方案也不错,另一方面,一个巨大的LUT将无法工作并转换arduino eighter上的所有值.
我建议你尝试使用本文中引用的不那么节能的技术来校正RGB值:
假设Ri,Bi是颜色输入,整数从0到255,所以Q = 255,输出为Wo,Ro,Go和Bo,值为0到255:
M = max(Ri,Bi) m = min(Ri,Bi) Wo = if (m/M < 0.5) use ( (m*M) / (M-m) ) else M Q = 255 K = (Wo + M) / m Ro = floor( [ ( K * Ri ) - Wo ] / Q ) Go = floor( [ ( K * Gi ) - Wo ] / Q ) Bo = floor( [ ( K * Bi ) - Wo ] / Q )
在实施之前在电子表格中进行练习,在Wo = m,m ^ 2和-m ^ 3 m ^ 2 m上进行实验,用正确的Qw校正Wo值,你会惊讶于没有校正的简单解决方案不是人们想要的期待和其他答案变化不大.检查纸张的颜色失真结果,我想如果你不校正RGB值,你最终会得到一些褪色的颜色.