Swift2 CIColor和CIFIlter:如何根据给定的图像调整图像颜色

Swift2 CIColor和CIFIlter:如何根据给定的图像调整图像颜色,swift2,cifilter,Swift2,Cifilter,我想用另一个图像替换图像的一部分。在这个过程中,我希望粘贴的图像看起来与它在原始图像中替换的部分相似,并且认为我需要调整粘贴图像的颜色 如何做到这一点?CIFilter应该使用什么样的潜在客户?迅速欢迎的榜样 在您看来,CIColorMatrix是否如我所猜测的那样有用,但在这种情况下,如何从原始图像部分获取颜色矩阵?您需要直方图规范。此操作获取一幅图像的直方图并将其应用于另一幅图像。遗憾的是,CoreImage不包括直方图操作,所以您需要查看vImage的金属性能着色器。我会为你快速浏览vIm

我想用另一个图像替换图像的一部分。在这个过程中,我希望粘贴的图像看起来与它在原始图像中替换的部分相似,并且认为我需要调整粘贴图像的颜色

如何做到这一点?CIFilter应该使用什么样的潜在客户?迅速欢迎的榜样

在您看来,CIColorMatrix是否如我所猜测的那样有用,但在这种情况下,如何从原始图像部分获取颜色矩阵?

您需要直方图规范。此操作获取一幅图像的直方图并将其应用于另一幅图像。遗憾的是,CoreImage不包括直方图操作,所以您需要查看vImage的金属性能着色器。我会为你快速浏览vImage()

重新创建上述示例的第一步是计算直方图。我们将使用中描述的相同技术将提供的CGImage转换为vImage缓冲区。然而,这一次,我们不是填充目标图像,而是填充四个无符号整数数组,其中包含四个颜色通道(红色、绿色、蓝色和alpha)的直方图值

vImage的API显示其C根,为了计算inBuffer的直方图,我们初始化了四个数组,创建指向这些数组的指针,并创建指向这些指针数组的指针:

let alpha = [UInt](count: 256, repeatedValue: 0)
let red = [UInt](count: 256, repeatedValue: 0)
let green = [UInt](count: 256, repeatedValue: 0)
let blue = [UInt](count: 256, repeatedValue: 0)

let alphaPtr = UnsafeMutablePointer<vImagePixelCount>(alpha)
let redPtr = UnsafeMutablePointer<vImagePixelCount>(red)
let greenPtr = UnsafeMutablePointer<vImagePixelCount>(green)
let bluePtr = UnsafeMutablePointer<vImagePixelCount>(blue)

let rgba = [alphaPtr, redPtr, greenPtr, bluePtr]

let histogram = UnsafeMutablePointer<UnsafeMutablePointer<vImagePixelCount>>(rgba)
原始数组alpha、red、green和blue现在用直方图数据填充

直方图规范

给定直方图数据,我们现在需要根据另一幅图像(本例中的日落)指定它。在我的示例中,我将这两个步骤分为两个函数,我的规范函数需要一个直方图元组,其形式如下:

histogram: (alpha: [UInt], red: [UInt], green: [UInt], blue: [UInt])
vImage specification函数,
VimageHistorogramSpecification_ARGB888(:::::)
需要一个不安全的可变指针,指向每个通道每个存储桶的像素计数的不安全指针。以下代码准备将直方图传递到vImage(
vImagePixelCount
Uint
的类型别名):

histogram: (alpha: [UInt], red: [UInt], green: [UInt], blue: [UInt])
let alphaPtr = UnsafePointer<vImagePixelCount>(histogram.alpha)
let redPtr = UnsafePointer<vImagePixelCount>(histogram.red)
let greenPtr = UnsafePointer<vImagePixelCount>(histogram.green)
let bluePtr = UnsafePointer<vImagePixelCount>(histogram.blue)

let rgba = UnsafeMutablePointer<UnsafePointer<vImagePixelCount>>([alphaPtr, redPtr, greenPtr, bluePtr])
vImageHistogramSpecification_ARGB8888(&inBuffer, &outBuffer, rgba, UInt32(kvImageNoFlags))