Как сохранить изображение с камеры, когда поддерживается только портретный интерфейс - PullRequest
0 голосов
/ 29 марта 2019

У меня есть контроллер вида, который делает снимки, используя AVCapturePhotoOutput.Я заблокировал возможные ориентации моего контроллера вида, чтобы предварительный просмотр камеры не вращался:

override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
        return .portrait
    }

Проблема 1: Поскольку я изменил это, когда я делаю снимок, результирующее изображение всегда имеет UIImageOrientation == .right, независимо от того, было ли устройство в портретном или альбомном режиме.

Проблема 2: Затем я хочу сохранить изображение в файловую систему, используя UIImageJPEGRepresentation, но этот метод не включает информацию exif относительноориентация (что пока нормально, так как ориентация в настоящее время неправильная из-за проблемы 1).

Я просто хочу сделать то, что делают многие другие приложения: отображение предварительного просмотра камеры, которая не вращается, когда устройствоповернут, но полученные изображения имеют правильную ориентацию, и я могу сохранить их.

Есть ли возможность сделать это без поворота данных изображения с использованием методов рисования?

1 Ответ

0 голосов
/ 05 апреля 2019

Проблема заключалась в том, что при блокировке ориентации интерфейса:

override var supportedInterfaceOrientations : UIInterfaceOrientationMask {
        return .portrait
}

Ориентация видео в слое предварительного просмотра не обновлялась, что теперь очевидно. Поскольку ориентация интерфейса заблокирована, я использую ориентацию устройства, чтобы сообщить соединению, какую ориентацию использовать. Таким образом, данные буфера будут иметь правильную ориентацию

@IBAction func shutterButtonDidClick(_ sender: Any) {

        guard let output = self.cameraSession.outputs.compactMap({ $0 as? AVCapturePhotoOutput }).first, let photoOutputConnection = output.connection(with: .video), let delegate = self.videoCaptureDelegate else { return }
        let deviceOrientation = UIDevice.current.orientation
        //Important line
        photoOutputConnection.videoOrientation = AVCaptureVideoOrientation(deviceOrientation: deviceOrientation)
        let photoSettings = AVCapturePhotoSettings()
        photoSettings.isHighResolutionPhotoEnabled = true
        photoSettings.flashMode = output.supportedFlashModes.contains(.auto) ? .auto : .off
        photoSettings.isAutoStillImageStabilizationEnabled =
        output.isStillImageStabilizationSupported
        output.capturePhoto(with: photoSettings, delegate: delegate)
    }

extension AVCaptureVideoOrientation {
    init(deviceOrientation: UIDeviceOrientation) {
        switch deviceOrientation {
        case .portrait: self = .portrait
        case .portraitUpsideDown: self = .portraitUpsideDown
        case .landscapeLeft: self = .landscapeRight
        case .landscapeRight: self = .landscapeLeft
        default: self = .portrait
        }
    }
}

...