ios - Swift iOS,想知道是否有人可以解释为什么输出旋转到正确的度数?

标签 ios swift uiimageorientation

我正在点击这里的链接 How to apply filter to Video real-time using Swift并且出于某种原因,UIImageOrientation 向左旋转了 90 度。我试图通过将方向设置为向上来纠正此问题,但它看起来仍然相同。有谁知道这是为什么?我不确定是图像、预览层还是 ImageView 导致的

代码如下:

import UIKit
import AVFoundation
import CoreMedia



     let noirFilter = CIFilter(name: "CIPhotoEffectNoir")!

     let sepiaFilter = CIFilter(name: "CISepiaTone")!

     let vignetteEffect = CIFilter(name: "CIVignetteEffect")!



     let Filters = [noirFilter,sepiaFilter,vignetteEffect]




    class TestViewController:UIViewController,AVCaptureVideoDataOutputSampleBufferDelegate {

        @IBOutlet weak var imageView: UIImageView!
        @IBOutlet weak var Photo: UIButton!
        var sessionQueue: dispatch_queue_t!
        var stillImageOutput: AVCaptureStillImageOutput?
        var videoDeviceInput: AVCaptureDeviceInput?

        var buttonTapped = false

        override func viewDidLoad() {
            super.viewDidLoad()




           sessionQueue = dispatch_queue_create("com.bradleymackey.Backchat.sessionQueue",DISPATCH_QUEUE_SERIAL)


            let captureSession = AVCaptureSession()
            captureSession.sessionPreset = AVCaptureSessionPresetPhoto

            let backCamera = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
            var videoDeviceInput: AVCaptureVideoDeviceInput?

            do
            {
                let input = try AVCaptureDeviceInput(device: backCamera)

                captureSession.addInput(input)
                 self.videoDeviceInput = videoDeviceInput
            }
            catch
            {
                print("can't access camera")
                return
            }



            // although we don't use this, it's required to get captureOutput invoked
            let previewLayer = AVCaptureVideoPreviewLayer(session: captureSession)







            view.layer.addSublayer(previewLayer)

             imageView.contentMode = UIViewContentMode.ScaleAspectFill

            let videoOutput = AVCaptureVideoDataOutput()

            videoOutput.setSampleBufferDelegate(self, queue: dispatch_queue_create("sample buffer delegate", DISPATCH_QUEUE_SERIAL))
            if captureSession.canAddOutput(videoOutput)
            {
                captureSession.addOutput(videoOutput)
            }




            captureSession.startRunning()

            let stillImageOutput: AVCaptureStillImageOutput = AVCaptureStillImageOutput()
            if captureSession.canAddOutput(stillImageOutput) {
                stillImageOutput.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG]
                captureSession.addOutput(stillImageOutput)

                self.stillImageOutput = stillImageOutput



        }
        }

        override func viewWillLayoutSubviews() {




        }




        func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!)
        {
             let filter = Filters[1]



            let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)
            let cameraImage = CIImage(CVPixelBuffer: pixelBuffer!)

            filter.setValue(cameraImage, forKey: kCIInputImageKey)

            let filteredImage = UIImage(CIImage: filter.valueForKey(kCIOutputImageKey) as! CIImage!)

            var newImage = UIImage(CIImage: filter.valueForKey(kCIOutputImageKey) as! CIImage!, scale:1.0, orientation: .Up)

            dispatch_async(dispatch_get_main_queue())
            {
                self.imageView.image = newImage
            }

        }

        @IBAction func snapStill(sender: UIButton) {
            print("snapStillImage")



            let previewController = PreviewViewController(nibName: "PreviewViewController", bundle: nil)
                        previewController.media = Media.Photo(image: imageView.image!)
                        previewController.isFrontCamera = false 

                        self.presentViewController(previewController, animated: true, completion: nil)

        }


        override func viewDidLayoutSubviews()
        {




        }


        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }
    }

最佳答案

这是因为没有设置方向。 您需要在 captureOutput() 中设置方向

func captureOutput(captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, fromConnection connection: AVCaptureConnection!) 
{
connection.videoOrientation = .portrait
...

这应该可以解决您的问题。

关于ios - Swift iOS,想知道是否有人可以解释为什么输出旋转到正确的度数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40250628/

相关文章:

ios - 如何加载图像并根据它的方向 exif 数据旋转它并使用 UIImageOrientationUp exif 数据保存它

ios - IOS 中的图像旋转

iphone - 圆形蒙版效果

ios - 无法同时满足约束自定义 header 部分

ios - 在 Swift playground 中禁用某些代码行的运行

arrays - 如何在 Swift 中为 UIPickerView 按字母顺序排列数组

ios - 对多个变量使用 arc4random

ios 快速从 url 下载视频到手机图库

iOS:开发 3D View 应用

iphone - iOS6 和 iOS5 中 UIImage Orientation 的不同行为