iOS 8.0+ 应用程序中使用 CoreImage 的 HSL 颜色调整滤镜

HSL color adjustment filter in an iOS 8.0+ app using CoreImage

我们想在 iOS 8.0+ 应用程序中使用 CoreImage 实现 HSL 颜色调整滤镜。

加载图像后,用户选择一种颜色(如红色),然后可以调整色调饱和度 , 并且 亮度 只有图像中的那种颜色。此滤镜在显示预览时可能会在一秒钟内应用多次,因此性能非常重要。

过滤器应该接受输入图像、目标颜色的参数,然后调整色调饱和度亮度.

CIImage *inputImage
UIColor *targetColor
float hueAdjustment (identity 0)
float saturationAdjustment (identity 0)
float luminanceAdjustment (identity 0)

我们已经尝试过这种方法,因为这会将 HSB 滤镜应用于整个图像而不是某些颜色,所以我们不能使用它 How to apply HSB color filters to UIImage

我觉得这涉及到 CIColorMatrix,但我不确定我们如何只使矩阵适用于特定的颜色范围。

如果您愿意只控制红色、绿色和蓝色,那么有一个简单的解决方案。我写了一个小的 CIColorKernel 接受三个图像并通过单独的通道将它们组合成一个:

kernel vec4 rgbChannelCompositing(__sample red, __sample green, __sample blue)
{
    return vec4(red.r, green.g, blue.b, 1.0);
}

这意味着您可以将控制色调 (CIHueAdjust)、饱和度和亮度 (CIColorControls) 的三个 CI 滤镜链应用于单个图像,并将它们与我的内核组合。

碰巧,我已经按照这些思路做了一些事情 - 你可以在这里看到我的 Swift 代码:https://github.com/FlexMonkey/Filterpedia/blob/master/Filterpedia/customFilters/RGBChannelCompositing.swift

希望对您有所帮助!

西蒙

编辑:完成的过滤器(在 Swift 中)是 available here!

好的,那换一种方法怎么样。您可以使用 Core Image 颜色内核对每个波段应用单独的处理,其中包括以下代码:

kernel vec4 rgbChannelCompositing(__sample pixel, vec3 hsl0, vec3 hsl1, [...])
{
    float hue = rgb2hsv(pixel).x; // there are lots of rgb2hsv() on the internet :)

    if (hue < color1)
    {
        return treatment(pixel, hsl0); 
    }
    else if (hue >= color1 && hue < color2)
    {
        return treatment(pixel, hsl1);
    }
    [...]

treatment() 函数将根据传递到核函数中的色调、饱和度和亮度值来施展魔法。这可能就像调整 HSV 值一样简单,使用互联网上众多 hsv2rgb() 实现之一将它们转换回 RGB 并将其返回。

您可能会出现一些条纹,在这种情况下 smoothstep() 会有所帮助。我做了类似的事情来创建伪彩色滤镜。就我而言,我是根据亮度而不是颜色来定义波段,但基本方法是相同的(我认为!)。

看看我的 CustomFilters.swift 文件中的 PseudoColor