首页 > 解决方案 > 在 UIIMageView 中加载或切换相机时图像 (UIImage) 方向发生变化

问题描述

我在我的应用程序的 2 个场景中面临这个方向问题。

  1. 视图控制器加载 >TensorFlow初始化 >UIImage设置为UIImageView
  2. PreviewView 使用rear相机 > 切换到front(> 切换到rear)

在每种情况下orientationUIImageuplandscape right。我从这里尝试了许多解决方案,但似乎无法解决问题。在这两种情况下,我仍然会以错误的方向获取图像。

这是一些代码:

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    ...
    let points = modelDataHandler.runModel(onFrame: imagePixelBuffer)
    ...
}

func runModel(onFrame pixelBuffer: CVPixelBuffer) -> [Corners : CGFloat] {
    ...
    guard let thumbnailPixelBuffer = pixelBuffer.uiImageConverted() else {
        return [:]
    }
    ...
}


extension CVPixelBuffer {
    func uiImageConverted() -> UIImage? {
        let ciImage = CIImage(cvPixelBuffer: self)
        let context = CIContext(options: nil)
        guard let cgImage = context.createCGImage(ciImage, from: CGRect(origin: .zero, size: CGSize(width: CVPixelBufferGetWidth(self), height: CVPixelBufferGetHeight(self)))) else { return nil }
        let uiImage = UIImage(cgImage: cgImage)
        return uiImage
    }
}
override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    tfQueue.async { [self] in
        modelDataHandler = ModelDataHandler()
        guard modelDataHandler != nil else {
            fatalError()
        }
        DispatchQueue.main.async {
            spinnerStack.isHidden = true
            spinner.stopAnimating()
            runButton.isEnabled = true
            runButton.tintColor = .label
            imageView.image = imageInfo?.originalImage.fixedOrientation()
            imageWidth = imageInfo?.originalImage.size.width ?? 0
            imageHeight = imageInfo?.originalImage.size.height ?? 0
        }
    }
}

extension UIImage {
    func fixedOrientation() -> UIImage? {
        guard let cImage = cgImage else { return nil }
        let currentOrientation = UIDevice.current.orientation
        let temp = CIImage(cgImage: cImage)
        var ciImage = temp
        switch currentOrientation {
        case .unknown, .portrait:
            ciImage = temp.oriented(forExifOrientation: 6)
        case .landscapeRight:
            ciImage = temp.oriented(forExifOrientation: 3)
        case .landscapeLeft:
            ciImage = temp.oriented(forExifOrientation: 1)
        default:
            break
        }
        
        guard let cgImage = CIContext(options: nil).createCGImage(ciImage, from: ciImage.extent) else { return nil }
        let fixedImage = UIImage(cgImage: cgImage)
        return fixedImage
    }
}

如何解决方向问题?

标签: iosswiftuiimage

解决方案


推荐阅读