RGB颜色值转换为XY值(ZigBee协议下常用的颜色表示方式)
程序员文章站
2022-07-13 17:22:43
...
最近在做Google Home Local 功能的适配,需要用到RGB转XY的颜色转换功能,之前在服务器端软件开发过程中也有遇到RGB转XY的需求,但是那个时候在网上找到了飞利浦的SDK,直接使用,就完成了项目也就没有去研究深层次的代码。但是这次是需要自己写Typescript的代码放到Google Home里面去,没有SDK可以直接使用,所以必须要自己写代码了。
直接先上代码,自己写的一个工具类里面的部分代码:
//伽马校准
private gamma_correction(value:number):number{
if (value > 0.04045) {
return Math.pow(((value + 0.055) / 1.055),2.4);
}
else {
return (value / 12.92);
}
}
//RGB转XYZ
private rgb2xyz(r: number, g: number, b: number) : XYZResult {
var x:number = (r * 0.664511 + g * 0.154324 + b * 0.162028);
var y:number = (r * 0.283881 + g * 0.668433 + b * 0.047685);
var z:number = (r * 0.000088 + g * 0.072310 + b * 0.986039);
var xyz:XYZResult = {x,y,z};
return xyz;
}
//XYZ转XY
private xyz2xy(x: number, y: number, z: number) :XYResult {
var xx:number = x / (x + y + z);
var yy:number = y / (x + y + z);
var xy:XYResult = {xx,yy};
return xy;
}
//RGB转XY
public rgb2xy(r: number, g: number, b: number) : XYResult {
let xyz = this.rgb2xyz(
this.gamma_correction(r),
this.gamma_correction(g),
this.gamma_correction(b)
);
return this.xyz2xy(xyz.x, xyz.y, xyz.z);
}
这段代码是TypeScript写的,你可以切换到你自己的语言,很容易,其实我也是总结了网上大神的代码自己写出来的,自己想想破脑袋也没有办法知道,里面的很多常数可能是前辈们的测量值。在实际工作中就看到同事根据灯珠的不同而通过积分球的测量值去生产色温灯的程序。rgb2xy方法中的常量值你可以去RGB和XYZ色彩空间的相互转换矩阵中寻找适合你们产品的。