我正在使用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)
此调用产生内部警告这一事实也不会灌输信心!
任何人都可以确认这种行为吗?我做错了什么?
答案 0 :(得分:2)
我也遇到了这个问题。范围总是这样设置
-8.98846567431158e + 307,-8.98846567431158e + 307,1.77969313486232e + 308,1.77969313486232e + 308
然后我尝试调用filter.debugDescription
并认识到在sourceImage中的范围是正确的。
这是我的解决方法。因为我使用了不同的过滤器,所以我会问过滤器名称是'CIColorClamp'
,然后我将CGImageRef
中使用的范围设置为原始图像中的值。
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
,导致错误的范围值。
因此看起来范围不会转移到过滤后的图像。
答案 1 :(得分:1)
我确实遇到了问题。我只是通过将返回的图像裁剪为原始图像rect(Objective-C代码)来修复它:
if ([filter.name isEqualToString:@"CIColorClamp"]) {
image = [image imageByCroppingToRect:sourceImage.extent];
}