我正在尝试在图像上使用CIColorClamp,该图像应仅将像素保持在指定范围内(https://developer.apple.com/library/archive/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/uid/TP30000136-SW42),但是当我在黑色像素上的结果之前和之后打印时,它给出的数值与我设置的数值不同在参数中。这是代码:
let ciImage = CIImage.init(cgImage: image.cgImage!)
let filter = CIFilter("CIColorClamp")!
filter.setDefaults()
filter.setValue(ciImage, forKey: kCIInputImageKey)
filter.setValue(CIVector(x: 0.8, y: 0.8, z: 0.8, w: 0), forKey: "inputMinComponents")
filter.setValue(CIVector(x: 1, y: 1, z: 1, w: 1), forKey: "inputMaxComponents")
let outputCIImage = filter.outputImage!
let context = CIContext.init()
let outputCGImage = context.createCGImage(outputCIImage, from: outputCIImage.extent)
let outputImage = UIImage(cgImage: outputCGImage, scale: image.scale, orientation: image.imageOrientation)
这应该在黑色像素(0,0,0,1)上给出(0.8,0.8,0.8,1),但是当我打印时它给出以下内容:
<CIColorClamp: inputImage=<CIImage: 0x28165d590 extent [0 0 800 160]>
inputMinComponents=[0.8 0.8 0.8 0] inputMaxComponents=[1 1 1 1]>
BEFORE 0.0, 0.0, 0.0, 1.0
AFTER 0.9058823529411765, 0.9058823529411765, 0.9058823529411765, 1.0
CoreImage是否还在做其他事情,而只是最小/最大?或者我不知道这里还有什么问题。
答案 0 :(得分:1)
我猜这是一个配色问题。默认情况下,Core Image执行从输入到工作到输出色彩空间的色彩匹配。如果输入图像的色彩空间与输出色彩空间不同,则可能会获得不同的像素值。
尝试完全不进行颜色匹配的方式设置CIContext
:
let context = CIContext(options: [.workingColorSpace: NSNull(), .outputColorSpace: NSNull()])
对于颜色钳位滤镜,这可能会起作用,因为它只是钳位值。不过,我不确定颜色矩阵滤镜是否需要某些特定的颜色空间。
您还可以在调试器中的outputCIImage
上执行快速查看,以查看Core Image在图像上实际执行的操作图。