Ios 核心图像的色彩平衡
我正试图用核心图像从Photoshop中重新创建一个“过滤器”。我得到了一些简单的东西,比如曝光、振动、色调曲线下降,但不知道如何用阴影、中间色调和高光来复制色彩平衡。我尝试过CIColorMatrix,但它在调整各个阴影/中间色调/高光的颜色时没有相同的效果。CIHighlightShadowAdjust也不会创建与Photoshop颜色平衡相同的颜色效果 我可以用什么来复制这种Photoshop色彩平衡,如下面的屏幕截图所示? 我将在这里输入一些我尝试使用colormatrix的代码:Ios 核心图像的色彩平衡,ios,swift,image,core-image,Ios,Swift,Image,Core Image,我正试图用核心图像从Photoshop中重新创建一个“过滤器”。我得到了一些简单的东西,比如曝光、振动、色调曲线下降,但不知道如何用阴影、中间色调和高光来复制色彩平衡。我尝试过CIColorMatrix,但它在调整各个阴影/中间色调/高光的颜色时没有相同的效果。CIHighlightShadowAdjust也不会创建与Photoshop颜色平衡相同的颜色效果 我可以用什么来复制这种Photoshop色彩平衡,如下面的屏幕截图所示? 我将在这里输入一些我尝试使用colormatrix的代码: l
let colorFilter = CIFilter(name: "CIColorMatrix")
colorFilter?.setValue(gammaOutput, forKey: kCIInputImageKey)
colorFilter?.setValue(CIVector.init(x: 0.9, y: 0, z: 0, w: 0), forKey: "inputRVector")
colorFilter?.setValue(CIVector.init(x: 0, y: 1.1, z: 0, w: 0), forKey: "inputGVector")
colorFilter?.setValue(CIVector.init(x: 0, y: 0, z: 1.2, w: 0), forKey: "inputBVector")
colorFilter?.setValue(CIVector.init(x: 0, y: 0, z: 0, w: 1), forKey: "inputAVector")
colorFilter?.setValue(CIVector.init(x: 0, y: 0, z: 0, w: 0), forKey: "inputBiasVector")
Core Image还允许开发您自己的自定义图像过滤器。所谓的自定义内核(CIKernel)是用OpenGL着色语言(GLSL)的方言编写的小程序,用于在GPU上运行自定义过滤器 Photoshop是封闭源码的,不清楚他们使用的是什么算法,但GIMP具有色彩平衡功能,并且是开源的 可在以下位置找到实现: 现在我们需要将其转换为GLSL 幸运的是,一位澳大利亚开发商已经做到了这一点,参见 要快速测试这是否会产生预期的结果,可以使用苹果公司的一个名为Quartz Composer的酷实用程序。 您可以从苹果的开发者网站下载,它隐藏在Xcode 9.3.dmg的附加工具中 在这里,您选择“图像过滤器”作为模板,删除输入和输出图像旁边的所有节点。从库中添加“核心图像过滤器”。然后选择过滤器并按CMD-2。您现在应该看到一个带有代码编辑器的检查器,它显示了一个简单的通用核心映像内核例程(CIKernel) 因为我们只需要访问相应的源像素,而不是整个图像,所以我们可以使用更具体的CIColorKernel而不是CIKernel函数 附加参数可以添加到内核函数中 给定gist文件中的代码(其本身基于GIMP的颜色平衡例程),可以复制辅助函数RGBToL、RGBToHSL、HueToRGB、HSLToRGB。然后是实际的CIColorKernel函数,我们刚刚调整了函数签名和返回值:
/* based on GIMP's color balance routine */
kernel vec4 balanceFilter(__sample textureColor,
float redShift,
float greenShift,
float blueShift) {
lowp float lightness = RGBToL(textureColor.rgb);
lowp vec3 shift = vec3(redShift, greenShift, blueShift);
const lowp float a = 0.25;
const lowp float b = 0.333;
const lowp float scale = 0.7;
lowp vec3 midtones = (clamp((lightness - b) / a + 0.5, 0.0, 1.0) * clamp ((lightness + b - 1.0) / -a + 0.5, 0.0, 1.0) * scale) * shift;
lowp vec3 newColor = textureColor.rgb + midtones;
newColor = clamp(newColor, 0.0, 1.0);
lowp vec3 newHSL = RGBToHSL(newColor);
lowp float oldLum = RGBToL(textureColor.rgb);
textureColor.rgb = HSLToRGB(vec3(newHSL.x, newHSL.y, oldLum));
return textureColor;
}
当输入代码时,它将自动编译。然后可以在Composer中连接节点,请参见屏幕截图。
选择过滤器节点后,可以使用CMD-1切换到输入检查器。Composer会自动生成带有红移、绿移和蓝移参数的UI,例如。
如果为绿色换档输入-0.64,您将看到以下结果:
一些补充说明:
- 源代码来自GIMP。如果你想使用它,请阅读GIMP的许可证
- GIMP的结果可能与Photoshop非常不同,我不知道,但可能仍然是自己实验的一个良好起点
- 显然,GIST中的实现只针对中间色调,但是通过链接到GIMP的源代码,应该可以很容易地扩展阴影和高光
- 要在iOS应用程序中使用内核,您必须将内核代码包装成字符串,并将其馈送到CIColorKernel构造函数中