2015-10-04 71 views
4

我正在使用Swift做一些視頻處理。升級到El Capitan(和Swift 2)後,我的代碼崩潰了。我將錯誤追溯到CIFilter函數CIColorClamp。這個函數被認爲是鉗位像素值,但實際上會混淆圖像範圍。CIColorClamp在OS X中無法正常工作El Capitan

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

我也遇到了這個問題。程度總是這樣設置

-8.98846567431158e + 307,+ -8.98846567431158e 307,1.79769313486232e + 308,+ 1.79769313486232e 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

我確實有這個問題。我簡單地通過將返回的圖像裁剪到原始圖像矩形(Objective-C代碼)來修復它:

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