在 UIIMageView 中加载或切换相机时图像 (UIImage) 方向发生变化

问题描述

我在我的应用中的 2 个场景中遇到了这个方向问题。

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

在每种情况下,orientationUIImageup 变为 landscape right。我从这里尝试了很多解决方案,但似乎并没有解决问题。在这两种情况下,我仍然以错误的方向获取图像。

这是一些代码:

  • 从 CMSampleBuffer 获取图像
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
    }
}
  • 将 UIImage 设置为 UIImageView
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
    }
}

如何解决方向问题?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...