How to implement a real-time performance view for core image filter

830 Views Asked by At

I would like to implement a real-time performance view for displaying core image filter output. Form the documentation of Apple, It seem that I should use a GPU based context for drawing.

There are some term I am confused. EAGLContext, CIContext, GLKView. What are these things? Also, should I use EAGLContext to create CGImage from CIImage and set it to UIImageView or using the GLKView. What are the difference of these two approaches?

1

There are 1 best solutions below

5
On BEST ANSWER

You can keep your image on the GPU by avoiding UIImageView and using the OpenGL view, GLKView. To get that working with CoreImage, you need to create a CIContext with a EAGL context:

let eaglContext = EAGLContext(API: .OpenGLES2)

lazy var ciContext: CIContext =
{
    [unowned self] in

    return CIContext(EAGLContext: self.eaglContext,
        options: [kCIContextWorkingColorSpace: NSNull()])
}()

The context of your GLKView should be the same eaglContext, it also needs a delegate that conforms to GLKViewDelegate.

To display an image, invalidate the display with setNeedsDisplay(). This will call glkView(:drawInRect:) on the delegate and it's in here you use the Core Image context to draw the image to the GLKView:

    ciContext.drawImage(image,
        inRect: targetRect,
        fromRect: image.extent)

Where image is the CIImage to display.

If all that sounds like too much effort, I've done the work for you, check out my CoreImageHelpers repo.

Simon