我们希望使用HSL
在iOS 8.0+
应用中实施CoreImage
颜色调整过滤器。
加载图像后,用户选择一种颜色(如红色),然后可以调整色调,饱和度和亮度强烈的>只有图像中的那种颜色。这个过滤器可以在一秒钟内多次应用,同时显示预览,因此性能非常重要。
过滤器应接受inputImage,目标颜色的参数,然后调整色调,饱和度和亮度。
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
,但我不确定我们如何只将矩阵应用于特定的颜色范围。
答案 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()
。