【问题标题】:CIFilter / CIImage : BSXPCMessage received error for message: Connection interruptedCIFilter / CIImage : BSXPCMessage 收到错误消息:连接中断
【发布时间】:2015-08-07 16:25:04
【问题描述】:

我正在开发一个基于“相机/照片”的应用程序。

应用程序启动 (sideMenu) : MainView 是一个普通的 VC,在一个带有相机按钮的 NavigationCTRL 中。
点击它会推动一个新的 VC。
这个很正常,但是里面有这样的东西:

let captureSession: AVCaptureSession = AVCaptureSession()
var currentCaptureDevice: AVCaptureDevice?
var deviceInput: AVCaptureDeviceInput?
var stillCameraOutput: AVCaptureStillImageOutput?
var previewLayer: AVCaptureVideoPreviewLayer?

所以它是一个自定义的相机视图控制器。
我可以 - 通过这种方式 - 获得更好的用户体验。
然后我可以拍照(从库中,或者通过点击拍摄按钮(在打开/关闭某些功能 [Timer, HD, Flash..] 之后)。

当它拍照时,我使用 prepareForSegue 方法将捕获的图像发送到下一个 VC :

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == Constants.Segues.CameraToFiltersSegue {
        var filterVC = segue.destinationViewController as! MYCLASSVC
        filterVC.originalImage = pictureImage
    }
}

然后,它推动了新的 VC AND...
我收到此消息:BSXPCMessage 收到消息错误:连接中断

当前 VC 包含:

  • 一个imageView(UIImageView):上一张图片
  • 一个小型集合视图,其中包含来自原始 (CIFilter) 的小型(缩略图)过滤图片

在此视图中仅此而已。但是我收到了这条消息。
这条消息怎么样?
我应该以不同的方式做某事吗?

这就是我设置过滤器的方式:

//At the top of the class
//EAGLRenderingAPI.OpenGLES2 but maybe EAGLRenderingAPI.OpenGLES3??
static let contextFast = CIContext(EAGLContext: EAGLContext(API: EAGLRenderingAPI.OpenGLES2), options: [kCIContextWorkingColorSpace: NSNull(), kCIContextUseSoftwareRenderer: false])

//In my static method (one of the parameter is "originalImage")
var ciimage: CIImage = CIImage(image: originalImage)
var imageFilter = CIFilter(name: "CIPhotoEffectInstant")
filter.setValue(ciimage, forKey: kCIInputImageKey)
let cgimg = contextFast.createCGImage(imageFilter.outputImage, fromRect: imageFilter.outputImage.extent())
return UIImage(CGImage: cgimg, scale: 1.0, orientation: image.imageOrientation)

这段代码运行得很快! 我不知道消息是从哪里来的。

如果您有任何想法或其他需要帮助的事情,请您帮忙?

【问题讨论】:

    标签: ios swift core-image cifilter ciimage


    【解决方案1】:

    如果我在下一行之前返回 nil,我永远不会收到消息。

    let cgimg = contextFast.createCGImage(filter.outputImage, fromRect: filter.outputImage.extent())
    

    如果我使用软件渲染器选项为“true”的正常上下文:

    let context = CIContext(options: [kCIContextUseSoftwareRenderer: true])
    

    消息消失。 我尝试将此选项放入我的最后一个 fastContext 中,但没有任何改变。
    所以它来自使用的上下文,但是对于正常的上下文,渲染的时间要长 5 倍(可能更多)。在快速的上下文中,我的 collectionView 从来没有慢过。我什至没有看到重新加载数据。
    但是在正常的上下文中,它是可见的。

    在基本的相机/照片应用程序中,Apple 也有同样的东西。一张图片和一个带有原始图片缩略图但已过滤的collectionView!他们是怎么做到的?我们甚至看不到正在加载的项目。

    【讨论】:

    • 嘿朱利安,你知道了吗?
    • EAGLContext 上,kCIContextUseSoftwareRenderer 似乎根本没有任何作用
    猜你喜欢
    • 2014-11-21
    • 2015-12-18
    • 1970-01-01
    • 2021-09-10
    • 2018-05-22
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多