使用CoreImage

时间:2016-03-14 20:05:52

标签: ios objective-c swift opengl-es core-image

我们希望使用HSLiOS 8.0+应用中实施CoreImage颜色调整过滤器。

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

过滤器应接受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 个答案:

答案 0 :(得分:4)

如果你愿意只为红色,绿色和蓝色控制,那么就有一个简单的解决方案。我写了一个小CIColorKernel,它接受​​三张图像,并通过各个渠道将它们合并为一个:

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

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

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

希望有所帮助!

西蒙

答案 1 :(得分:3)

编辑:已完成过滤器(在Swift中)为available here

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

<?php
    $imagedir = 'images';
    //Get *.png files only
    $images = array_filter(glob("$imagedir/*.png"), 'is_file');

    //Make image array divisble by 3 (columns)
    while (count($images) % 3 != 0) {
        $images[] = '';
    }

    echo'<table><tr>';
    for ($i = 1; $i <= count($images); $i++) {
        //Render TD if $image is not empty
        if ($images[$i-1] != '' != '') {
            echo '<td><img src="' . $images[$i-1] . '">', "<br>Image $i</td>";
        }
        //Close table row after 3 TD's
        if($i % 3 == 0) 
        {
            echo '</tr><tr>';
        }
    }
    echo '</tr></table>';

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); } [...] 函数将根据传递给内核函数的色调,饱和度和亮度值来实现魔力。这可以像调整HSV值一样简单,使用互联网上的许多treatment()实现之一将它们转换回RGB并返回。

你可能会收到一些条带,在这种情况下,hsv2rgb()会有所帮助。我做过类似的事情来创建一个伪彩色滤镜。就我而言,我根据亮度而不是颜色来定义乐队,但基本方法是相同的(我想!)。

查看我的CustomFilters.swift文件中的smoothstep()