我想写一个函数来改变RGB colored颜色 的色调.具体来说,我在iOS应用程序中使用它,但数学是通用的.
下图显示了R、G和B值如何随色调变化.
现在看来,编写一个函数来改变色调应该是一件相对简单的事情,而不需要对不同的 colored颜色 格式进行任何令人讨厌的转换,这会带来更多的错误(如果继续对 colored颜色 进行小的改变,这可能是一个问题),我怀疑计算成本会更高.
以下是我到目前为止所做的工作.如果你从纯黄色、青色或洋红转向,它的效果非常好,但在其他地方,它会变得有点蓬松.
Color4f ShiftHue(Color4f c, float d) {
if (d==0) {
return c;
}
while (d<0) {
d+=1;
}
d *= 3;
float original[] = {c.red, c.green, c.blue};
float returned[] = {c.red, c.green, c.blue};
// big shifts
for (int i=0; i<3; i++) {
returned[i] = original[(i+((int) d))%3];
}
d -= (float) ((int) d);
original[0] = returned[0];
original[1] = returned[1];
original[2] = returned[2];
float lower = MIN(MIN(c.red, c.green), c.blue);
float upper = MAX(MAX(c.red, c.green), c.blue);
float spread = upper - lower;
float shift = spread * d * 2;
// little shift
for (int i = 0; i < 3; ++i) {
// if middle value
if (original[(i+2)%3]==upper && original[(i+1)%3]==lower) {
returned[i] -= shift;
if (returned[i]<lower) {
returned[(i+1)%3] += lower - returned[i];
returned[i]=lower;
} else
if (returned[i]>upper) {
returned[(i+2)%3] -= returned[i] - upper;
returned[i]=upper;
}
break;
}
}
return Color4fMake(returned[0], returned[1], returned[2], c.alpha);
}
我知道你可以用UIColors来做这件事,然后用这样的东西来改变色调:
CGFloat hue;
CGFloat sat;
CGFloat bri;
[[UIColor colorWithRed:parent.color.red green:parent.color.green blue:parent.color.blue alpha:1] getHue:&hue saturation:&sat brightness:&bri alpha:nil];
hue -= .03;
if (hue<0) {
hue+=1;
}
UIColor *tempColor = [UIColor colorWithHue:hue saturation:sat brightness:bri alpha:1];
const float* components= CGColorGetComponents(tempColor.CGColor);
color = Color4fMake(components[0], components[1], components[2], 1);
但我对此并不着迷,因为它只在iOS 5中起作用,在分配大量彩色对象和从RGB转换到HSB再转换回来之间,似乎有点过头了.
我可能最终会使用一个查找表或预先计算应用程序中的 colored颜色 ,但我真的很好奇是否有办法让我的代码正常工作.谢谢