2016-09-25 143 views
0

我試圖用CIKernel製作原創的CIFilter。iOS:CIColorKernel applyWithExtent警告消息

代碼在這裏。

var kernel: CIKernel? 
var inputImage: CIImage? 

override init() { 
    super.init() 
    self.kernel = createKernel() 
} 

required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder)! 
    self.kernel = createKernel() 
} 

func outputCustomImage() -> CIImage? { 

    if let inputImage = self.inputImage { 
     let dod = inputImage.extent.insetBy(dx: -1, dy: -1) 
     let args = [inputImage as AnyObject] 

     let callback: CIKernelROICallback = { 
     (index, rect) in 
      return rect.insetBy(dx: -1, dy: -1) 
     } 

     return kernel!.applyWithExtent(dod, roiCallback: callback, arguments: args) 
    } 
    return nil 
} 

private func createKernel() -> CIKernel { 
    let kernelString = 
     "kernel vec4 RGB_to_GBR(sampler source_image)\n" + 
      "{\n" + 
      "vec4 originalColor, twistedColor;\n" + 
      "originalColor = sample(source_image, samplerCoord(source_image));\n" + 
      "twistedColor.r = originalColor.g;\n" + 
      "twistedColor.g = originalColor.b;\n" + 
      "twistedColor.b = originalColor.r ;\n" + 
      "twistedColor.a = originalColor.a;\n" + 
      "return twistedColor;\n" + 
    "}\n" 

    return CIKernel(string: kernelString)! 
} 

和警告消息是

注:CIColorKernel applyWithExtent:roiCallback:參數:忽略回調,並且不推薦。使用applyWithExtent:arguments:來代替。

回答

1

我想也許你提供的源代碼與生成警告的代碼不同。對於您正在編寫的過濾器,您只需要一個CIColorKernel,如果您提供ROI回調,則會生成該警告。

如果您需要訪問其他像素(例如,如果您正在編寫模糊濾鏡),則通用內核(CIKernel)很有用。由於您只對當前像素感興趣,因此請使用顏色內核並使用apply(withExtent:arguments:)

通常,如果您繼承CIFilter,則覆蓋outputImage。看看這個版本(我也簡化了你的內核代碼):

class RGB_to_GBR: CIFilter { 

    let kernel: CIColorKernel = { 
     let kernelString = 
      "kernel vec4 RGB_to_GBR(__sample pixel)\n" + 
      "{\n" + 
      "vec4 twistedColor = pixel.gbra;\n" + 

      "return twistedColor;\n" + 
     "}\n" 

     return CIColorKernel(string: kernelString)! 
    }() 


    var inputImage: CIImage? 

    override var outputImage: CIImage? { 
     guard let inputImage = inputImage else { 
      return nil 
     } 

     return kernel.apply(withExtent: inputImage.extent, 
          arguments: [inputImage]) 
    } 
} 
+0

感謝您的回答,我瞭解CIKernel和CIColorKernel之間的區別。 –

+0

另外我找到了關於Core Image的書。它看起來很有幫助,所以我會買它:) –