RGB颜色位图和HSV双线性插值颜色

时间:2012-10-18 00:24:06

标签: math graphics colors rgb hsv

我想使用该算法将HSV颜色值转换为RGB颜色,以计算200 x 200 RGB位图,其角落中的颜色为红色,绿色,蓝色和白色,其他地方为双线性插值的HSV颜色,并计算具有双线性插值RGB颜色的位图。我在wikipedia中找到了公式,但我对如何做到这一点很困惑。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

好的,我想我知道你在做什么。我没有试过运行任何这个,所以它可能有一些错误...

首先,您需要计算红色,绿色,蓝色和白色的HSV值。称它们为顺时针方向,a,b,c,d - 例如,白色将是[0,0,1]或者像那样缩放的东西

对于网格中的位置,(x,y)0 <= x <= 1插值位是这样的,将值放入数组out

for(int i=0; i<3; i++){
  out[i] = y*((x*a[i]) + ((1-x)*b[i])) + (1-y)*((x*d[i]) + ((1-x)*c[i]));
}

当找到线性插值时,A和B之间的x的一部分由x*A + (1-x)*B给出。只需为每个方向做一次。

然后使用维基百科文章

中的约定将它们转换为RGB
void HSVtoRGB(double H, double S, double V, double[] out){
   double C = S*V;
   double H_prime = H/60; // a number in [0,3]
   double X = C*(1 - abs((H_prime%2)-1));

   // Do the big if bit
   switch((int)X){
     case 0:
       out[0] = C;
       out[1] = X;
       out[2] = 0;
     case 1:
       out[0] = X;
       out[1] = C;
       out[2] = 0;

      // etc etc

  }

  double m = V - C;
  for(int i=0; i<3; i++){
    out[i] += m;
  }
}

应该这样做,给予或接受。好吧,至少应该给你一个粗略的想法。