CIColorClamp在OS X El Capitan中无法正常工作

5

我正在使用Swift进行视频处理。在升级到El Capitan(和Swift 2)之后,我的代码出现了问题。我追踪到一个错误,原因是CIFilter函数CIColorClamp。这个函数应该夹住像素值,但实际上会破坏图像范围。

    let _c:CGFloat = 0.05
    let minComp = CIVector(x:_c, y:_c, z:_c, w: 1)
    let maxComp = CIVector(x:1, y:1, z:1, w: 1)
    let clamp: CIFilter = CIFilter(name: "CIColorClamp")!
    print("clamp-in \(image.extent)")
    clamp.setDefaults()
    clamp.setValue(image, forKey: kCIInputImageKey)
    clamp.setValue(minComp, forKey: "inputMinComponents")
    clamp.setValue(maxComp, forKey: "inputMaxComponents")
    print("clamp-out \(clamp.outputImage!.extent)")

上面的代码会产生以下输出:
> clamp-in (6.0, 6.0, 1268.0, 708.0)
CoreAnimation: Warning! CAImageQueueSetOwner() is deprecated and does nothing. Please stop calling this method.
> clamp-out (-8.98846567431158e+307, -8.98846567431158e+307, 1.79769313486232e+308, 1.79769313486232e+308)

这个调用产生内部警告的事实也不会增强信心!

有人能确认这种行为吗?我做错了什么吗?

2个回答

2
我也遇到了这个问题,extent一直设置为:
-8.98846567431158e+307, -8.98846567431158e+307, 1.79769313486232e+308, 1.79769313486232e+308。但是,我尝试调用filter.debugDescription后发现sourceImage中的extent已经正确给出。
以下是我的解决方法。由于我使用不同的滤镜,我会询问滤镜名称是否为'CIColorClamp',然后将在CGImageRef中使用的extent设置为原始图像中的值。
var extent = filteredImage.extent
if filter.name == "CIColorClamp" {
    extent = sourceImage.extent
}
let cgImage:CGImageRef = context.createCGImage(filteredImage, fromRect: extent)
UIImageJPEGRepresentation(UIImage(CGImage: cgImage), 1.0).writeToFile(...)

在进行修复之前,我总是会遇到崩溃的问题,因为UIImageJPEGRepresentation无法创建,原因是错误的范围值。
因此,看起来似乎范围没有传递到过滤后的图像中。

2

我曾经遇到过同样的问题。我通过裁剪返回的图像来修复它,使其与原始图像矩形一致(使用Objective-C代码):

if ([filter.name isEqualToString:@"CIColorClamp"]) {
    image = [image imageByCroppingToRect:sourceImage.extent];
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接