CTL 中的去饱和颜色
Desaturating Colours in CTL
希望创建一个带有颜色变换的 CTL,该颜色变换可以去除一对相反颜色的饱和度。
我下面的例子有效:但不像预期的那样:
__DEVICE__ float3 squeeze_GM(float percentage, float R, float G, float B) {
float rOut = R - (((percentage/2) / 100) * R);
float gOut = G - ((percentage / 100) * G);
float bOut = B - (((percentage/2) / 100) * B);
return make_float3(rOut, gOut, bOut);
}
__DEVICE__ float3 transform(int p_Width, int p_Height, int p_X, int p_Y, float p_R, float p_G, float p_B){
float3 result = squeeze_GM(15, p_R, p_G, p_B);
return result;
}
我想挤压绿色和洋红色,以便将这些颜色按一定百分比去饱和并传递给 squeeze_GM
函数。
有谁知道我如何获得此转换的任何详细信息?目前我认为我只是将 RGB 值变暗了一定百分比。我需要平均我的 R 和 B 结果吗?
在 Wiki 上查看 HUE
一个想法可以是:
void HSV(uint8_t rgb[]){
int32_t r,g,b;
int32_t MaxVal,Minim,MedValue,MinValue;
int32_t Huecalc=0;
r=rgb[0];
g=rgb[1];
b=rgb[2];
Minim=255;
if(Minim>r)Minim=r; //if red=128
if(Minim>g)Minim=g; //if green=200
if(Minim>b)Minim=b; //if blue= 254
// Minim = 128;
MaxVal=0;
if(MaxVal<r)MaxVal=r; //if red=128
if(MaxVal<g)MaxVal=g; //if green=200
if(MaxVal<b)MaxVal=b; //if blue= 254
// MaxVal = 254
MedValue=MaxVal-Minim; // MedValue = 254-128 > 0
MinValue=Minim; // MinValue = 128
if(MedValue>0){
if(MaxVal==r)Huecalc=0L*MedValue+(g-b); // Wiki HUE THEORY explain this
if(MaxVal==g)Huecalc=2L*MedValue+(b-r);
if(MaxVal==b)Huecalc=4L*MedValue+(r-g);
HUE=Huecalc*254/6/MedValue; // %254
}
if(MinValue>0){
SAT=MedValue*254/MinValue; // %254
}
}
希望创建一个带有颜色变换的 CTL,该颜色变换可以去除一对相反颜色的饱和度。
我下面的例子有效:但不像预期的那样:
__DEVICE__ float3 squeeze_GM(float percentage, float R, float G, float B) {
float rOut = R - (((percentage/2) / 100) * R);
float gOut = G - ((percentage / 100) * G);
float bOut = B - (((percentage/2) / 100) * B);
return make_float3(rOut, gOut, bOut);
}
__DEVICE__ float3 transform(int p_Width, int p_Height, int p_X, int p_Y, float p_R, float p_G, float p_B){
float3 result = squeeze_GM(15, p_R, p_G, p_B);
return result;
}
我想挤压绿色和洋红色,以便将这些颜色按一定百分比去饱和并传递给 squeeze_GM
函数。
有谁知道我如何获得此转换的任何详细信息?目前我认为我只是将 RGB 值变暗了一定百分比。我需要平均我的 R 和 B 结果吗?
在 Wiki 上查看 HUE
一个想法可以是:
void HSV(uint8_t rgb[]){
int32_t r,g,b;
int32_t MaxVal,Minim,MedValue,MinValue;
int32_t Huecalc=0;
r=rgb[0];
g=rgb[1];
b=rgb[2];
Minim=255;
if(Minim>r)Minim=r; //if red=128
if(Minim>g)Minim=g; //if green=200
if(Minim>b)Minim=b; //if blue= 254
// Minim = 128;
MaxVal=0;
if(MaxVal<r)MaxVal=r; //if red=128
if(MaxVal<g)MaxVal=g; //if green=200
if(MaxVal<b)MaxVal=b; //if blue= 254
// MaxVal = 254
MedValue=MaxVal-Minim; // MedValue = 254-128 > 0
MinValue=Minim; // MinValue = 128
if(MedValue>0){
if(MaxVal==r)Huecalc=0L*MedValue+(g-b); // Wiki HUE THEORY explain this
if(MaxVal==g)Huecalc=2L*MedValue+(b-r);
if(MaxVal==b)Huecalc=4L*MedValue+(r-g);
HUE=Huecalc*254/6/MedValue; // %254
}
if(MinValue>0){
SAT=MedValue*254/MinValue; // %254
}
}