2016-03-14 21 views
2

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

加载图像之后,用户选择的颜色(如红色),然后是能够调整色调饱和,并且只有图像内的色的亮度。此过滤器可能会在显示预览的同时多次应用,因此性能非常重要。

滤波器应接受inputImage的的参数,目标颜色,然后色调饱和的调整,和亮度

UI example

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 ,但我不确定我们如何才能使矩阵适用于特定的颜色范围。

+2

虽然听起来很蠢,但你对“一种颜色”的定义是什么?如果我选择红色 - (1.0,0.0,0.0) - 并将其映射到蓝色,那么我的源图像中像素会发生什么变化,例如(0.99,0.0,0.0)?不会因为数字上的不同而产生不同的颜色,因为它足够接近,通过与红色接近的比例相关的数量来调整,就好像是纯红色一样,还是其他的东西? – Tommy

+0

它根本不是白痴。正如你所说的那样,它应该按照一定比例的量进行颜色调整。比例本身可以设置为“容差”或其他一些变量,可能每种颜色的容差都会被调整,或者通过其他类似的方法 – Efesus

回答

3

编辑:完整的过滤器(斯威夫特)是available here

好的,那么另一种方法呢。你可以单独治疗适用于每个频段采用了酷睿图像色彩核心,其中将包括沿行代码:

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

4

如果您愿意只对红色,绿色和蓝色进行控制,则有一个简单的解决方案。我写了接受三幅图像,并将它们组合成一个由各个频道的小CIColorKernel

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

这意味着你可以使用3支CI过滤链控制色相(CIHueAdjust),饱和度和亮度(CIColorControls)到你的单图像并将它们与我的内核结合起来。

恰巧,我已经做了类似的规定 - 你可以看到我的雨燕代码在这里:https://github.com/FlexMonkey/Filterpedia/blob/master/Filterpedia/customFilters/RGBChannelCompositing.swift

希望帮助!

西蒙

+0

谢谢!这可能会有所帮助,但我们正在使用8种特定颜色(如0.27,0.90,0.27)而不是RGB,所以您是否有任何想法如何调整以适应任意颜色? – Efesus