如何实现核心图像过滤器的实时性能视图
How to implement a real-time performance view for core image filter
我想实现一个实时性能视图来显示核心图像过滤器输出。从Apple的文档来看,我似乎应该使用基于GPU的上下文来绘图。
有一些术语我很困惑。 EAGLContext
、CIContext
、GLKView
。这些是什么?另外,我应该使用 EAGLContext
从 CIImage
创建 CGImage
并将其设置为 UIImageView
还是使用 GLKView
。这两种方法有什么区别?
您可以通过避免 UIImageView
并使用 OpenGL 视图 GLKView
来将图像保留在 GPU 上。要使其与 CoreImage 一起使用,您需要创建一个带有 EAGL 上下文的 CIContext
:
let eaglContext = EAGLContext(API: .OpenGLES2)
lazy var ciContext: CIContext =
{
[unowned self] in
return CIContext(EAGLContext: self.eaglContext,
options: [kCIContextWorkingColorSpace: NSNull()])
}()
你的GLKView
的上下文应该是一样的eaglContext
,它也需要一个符合GLKViewDelegate
.
的委托
要显示图像,请使用 setNeedsDisplay()
使显示无效。这将在委托上调用 glkView(:drawInRect:)
并且在这里您使用 Core Image 上下文将图像绘制到 GLKView
:
ciContext.drawImage(image,
inRect: targetRect,
fromRect: image.extent)
其中 image
是要显示的 CIImage
。
如果这听起来太费力了,我已经为您完成了工作,请查看我的 CoreImageHelpers 存储库。
西蒙
我想实现一个实时性能视图来显示核心图像过滤器输出。从Apple的文档来看,我似乎应该使用基于GPU的上下文来绘图。
有一些术语我很困惑。 EAGLContext
、CIContext
、GLKView
。这些是什么?另外,我应该使用 EAGLContext
从 CIImage
创建 CGImage
并将其设置为 UIImageView
还是使用 GLKView
。这两种方法有什么区别?
您可以通过避免 UIImageView
并使用 OpenGL 视图 GLKView
来将图像保留在 GPU 上。要使其与 CoreImage 一起使用,您需要创建一个带有 EAGL 上下文的 CIContext
:
let eaglContext = EAGLContext(API: .OpenGLES2)
lazy var ciContext: CIContext =
{
[unowned self] in
return CIContext(EAGLContext: self.eaglContext,
options: [kCIContextWorkingColorSpace: NSNull()])
}()
你的GLKView
的上下文应该是一样的eaglContext
,它也需要一个符合GLKViewDelegate
.
要显示图像,请使用 setNeedsDisplay()
使显示无效。这将在委托上调用 glkView(:drawInRect:)
并且在这里您使用 Core Image 上下文将图像绘制到 GLKView
:
ciContext.drawImage(image,
inRect: targetRect,
fromRect: image.extent)
其中 image
是要显示的 CIImage
。
如果这听起来太费力了,我已经为您完成了工作,请查看我的 CoreImageHelpers 存储库。
西蒙