2016-09-25 13 views
0

CIKernelでオリジナルのCIFilterを作成しようとしています。iOS:CIColorKernel applyWithExtent警告メッセージ

コードはこちらです。 CIColorKernel applyWithExtent:roiCallback:引数:

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)! 
} 

と警告メッセージが

注意されたコールバックを無視し、お奨めしません。代わりに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についてのあなたの本が見つかりました。その外観はとても役に立ちますので、私はそれを購入します:) –