ios - 在 UIIMageView 中加载或切换相机时图像 (UIImage) 方向发生变化
问题描述
我在我的应用程序的 2 个场景中面临这个方向问题。
- 视图控制器加载 >
TensorFlow
初始化 >UIImage
设置为UIImageView
- PreviewView 使用
rear
相机 > 切换到front
(> 切换到rear
)
在每种情况下orientation
的UIImage
从up
到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
}
}
如何解决方向问题?
解决方案
推荐阅读
- algorithm - Big-Theta 符号
- vuejs3 - vue3 和 stylelint,如何修复 --Unexpected unknown pseudo-class selector,":deep"
- python - 如何使用 python 将 .mha 转换为 .stl
- c# - ASP.NET Web API - HttpClient.PostAsync 本地 API 不会进入代码
- python-3.x - 'submit_for_settlement'=True Braintree python 上的 AuthorizationError
- python - Clipspy printout rule
- python - Django 休息框架。向 request.data 添加了新的列表元素,但将新元素作为嵌套列表获取
- c++ - C++ std:cout 不会打印,尽管我使用 std::endl 输入换行符并刷新
- azure-devops - Git 概念 - 头部和最新提交之间的区别
- ajax - 我将 JSON 数据传递给依赖输入字段