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
。
我们想在 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
。