Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 核心图像的色彩平衡_Ios_Swift_Image_Core Image - Fatal编程技术网

Ios 核心图像的色彩平衡

Ios 核心图像的色彩平衡,ios,swift,image,core-image,Ios,Swift,Image,Core Image,我正试图用核心图像从Photoshop中重新创建一个“过滤器”。我得到了一些简单的东西,比如曝光、振动、色调曲线下降,但不知道如何用阴影、中间色调和高光来复制色彩平衡。我尝试过CIColorMatrix,但它在调整各个阴影/中间色调/高光的颜色时没有相同的效果。CIHighlightShadowAdjust也不会创建与Photoshop颜色平衡相同的颜色效果 我可以用什么来复制这种Photoshop色彩平衡,如下面的屏幕截图所示? 我将在这里输入一些我尝试使用colormatrix的代码: l

我正试图用核心图像从Photoshop中重新创建一个“过滤器”。我得到了一些简单的东西,比如曝光、振动、色调曲线下降,但不知道如何用阴影、中间色调和高光来复制色彩平衡。我尝试过CIColorMatrix,但它在调整各个阴影/中间色调/高光的颜色时没有相同的效果。CIHighlightShadowAdjust也不会创建与Photoshop颜色平衡相同的颜色效果

我可以用什么来复制这种Photoshop色彩平衡,如下面的屏幕截图所示?

我将在这里输入一些我尝试使用colormatrix的代码:

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构造函数中