1

「カメラ/写真」ベースのアプリケーションに取り組んでいます。

アプリケーションの起動 (sideMenu) : MainView は、カメラ ボタンを備えたNavigationCTRL内の通常の VC です。
それをタップすると、新しい VC がプッシュされます。
これは正常ですが、内部には次のようなものがあります。

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

つまり、カスタム カメラ ビュー コントローラーです。
この方法で、ユーザー エクスペリエンスを向上させることができます。
次に、(ライブラリから、またはショットボタンをタップして)写真を撮ることができます(いくつかの機能[タイマー、HD、フラッシュ..]をオン/オフにした後。

写真を撮ったら、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 をプッシュし、...
私はこのメッセージを受け取りました: 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)

このコードは高速に実行されます。メッセージがどこから来るのかわかりません。

何かアイデアや何かお手伝いできることがあればお願いします。

4

1 に答える 1

2

次の行の前に nil を返すと、メッセージは表示されません。

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

そして、ソフトウェア レンダラー オプションを "true" にして通常のコンテキストを使用すると、次のようになります。

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

メッセージが消えます。このオプションを最後の fastContext に入れようとしましたが、何も変わりませんでした。
したがって、それは used context に由来しますが、通常のコンテキストでは、レンダリングは x5 長く (おそらくそれ以上) なります。高速なコンテキストでは、collectionView が低速になることはありません。データのリロードすら見られません。
しかし、通常のコンテキストでは、それは目に見えます。

基本的なカメラ/写真アプリケーションでは、Apple は同じものを持っています。元の画像のサムネイルがフィルター処理された画像と collectionView です。彼らはどのようにそれをしますか?アイテムがロードされているのを見ることさえできません。

于 2015-08-07T08:25:04.227 に答える