Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 用核心图像内核语言实现RGB到HSL的颜色转换_Swift_Graphics_Rgb_Quartz Graphics_Core Image - Fatal编程技术网

Swift 用核心图像内核语言实现RGB到HSL的颜色转换

Swift 用核心图像内核语言实现RGB到HSL的颜色转换,swift,graphics,rgb,quartz-graphics,core-image,Swift,Graphics,Rgb,Quartz Graphics,Core Image,我正在尝试创建图像过滤器,它将改变图像的颜色。为了做到这一点,我需要将rgb颜色转换为hsl,并在shift之后,将hsl转换回rgb。我做了一些研究,找到了一些可以帮助我完成这项任务的公式 我在我的操场上使用Swift实现它们,只是为了测试它们是否可靠。我不会在这里发布Swift代码只是为了保持整洁,但我会显示我的测试结果: 输入:rgb(61117237)或(0.24,0.46,0.93) 结果: rgb2hsl [0.613527 0.831325 0.585] or (221, 83,

我正在尝试创建图像过滤器,它将改变图像的颜色。为了做到这一点,我需要将rgb颜色转换为hsl,并在shift之后,将hsl转换回rgb。我做了一些研究,找到了一些可以帮助我完成这项任务的公式

我在我的操场上使用Swift实现它们,只是为了测试它们是否可靠。我不会在这里发布Swift代码只是为了保持整洁,但我会显示我的测试结果:

输入:rgb(61117237)或(0.24,0.46,0.93)

结果:

rgb2hsl [0.613527 0.831325 0.585] or (221, 83, 58.5) //hsl
hsl2rgb [0.24 0.46 0.93] //back to rgb

太好了!到目前为止还不错

现在我们需要将Swift代码转换为核心映像内核语言(CIKL)。 这是:

float hue2rgb(float f1, float f2, float hue) {
   if (hue < 0) {
      hue += 1.0;
   }
   else if (hue > 1) {
      hue -= 1.0;
   }

   float res;
   if (6*hue<1) {
      res = f1 + (f2 - f1) * 6 * hue;
   }
   else if (2*hue<1) { 
      res = f2;
   }
   else if (3*hue<2) {
      res = f1 + (f2 - f1) * (2.0/3.0 - hue) * 6;
   }
   else {
       res = f1;
   }
   return res;
}


vec3 hsl2rgb(vec3 hsl) {
   vec3  rgb;
   if (hsl.y == 0) {
      rgb = vec3(hsl.z,hsl.z,hsl.z);
   }
   else {
      float f2;
      if (hsl.z < 0.5) {
         f2 = hsl.z * (1.0 + hsl.y);
      } 
      else {
         f2 = hsl.z + hsl.y - hsl.y * hsl.z;
      }

      float f1 = 2 * hsl.z - f2;

      float r = hue2rgb(f1, f2, hsl.x + 1.0/3.0);
      float g = hue2rgb(f1, f2, hsl.x);
      float b = hue2rgb(f1, f2, hsl.x - 1.0/3.0);

      rgb = vec3(r,g,b);
   }
   return rgb;
}



vec3 rgb2hsl(vec3 rgb) {

   float maxC = max(rgb.x, max(rgb.y,rgb.z));
   float minC = min(rgb.x, min(rgb.y,rgb.z));

   float l = (maxC + maxC)/2.0;

   float h = 0;
   float s = 0;

   if (maxC != minC) {
      float d = maxC - minC;
      s = l > 0.5 ? d / (2.0 - maxC - minC) : d / (maxC + minC);

      if (maxC == rgb.x) {      
         h =  (rgb.y - rgb.z) / d + (rgb.y < rgb.z ? 6.0 : 0);
      } else if (maxC == rgb.y) {
         h = (rgb.z - rgb.x) / d + 2.0;
      }
      else {
         h = (rgb.x - rgb.y) / d + 4.0;
      }

      h /= 6.0;
   }

   return vec3(h,s,l);
}
过滤器包括上面列出的功能

我在查看器中看到的结果是:

右侧的图像是从输入颜色裁剪的恒定颜色图像。 左边的图像是我们的过滤器的输出

数字颜色选择器返回左图像的rgb(237239.7252)


我不知道如何调试这个东西并发现问题。我们将非常感谢您的帮助。谢谢。

我发现了问题。是我,将代码从Swift转换为CIKL,我犯了一个很难找到的愚蠢错误,因为CIKL中没有打印/日志工具,或者我不知道。 无论如何,问题出在rgb2hsl函数中:

float l = (maxC + maxC)/2.0; // WRONG
应该是:

float l = (maxC + minC)/2.0;
希望将来能对别人有所帮助

float l = (maxC + minC)/2.0;