【问题标题】:How fix UIImage orientation when converted from CIIImage iOS swift从 CIIImage iOS swift 转换时如何修复 UIImage 方向
【发布时间】:2021-10-13 19:25:15
【问题描述】:

我正在制作一个简单的视频捕捉应用。我使用 UIImageView 作为我的预览层,因为我可能需要使用 CIFilter。但问题是当图像从 CIImage 转换为 UIImage 并显示在图像视图中时,它的方向会发生变化。我该如何解决它

import UIKit
import  AVKit

class VideoCaptureVC: UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {

 
    @IBOutlet weak var VideoPreviewImageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let capturesession = AVCaptureSession()
        guard let rearcamera = AVCaptureDevice.default(for: .video) else{return}
       // guard let mic = AVCaptureDevice.default(for: .audio) else{return}
        guard let inputdevice = try? AVCaptureDeviceInput(device: rearcamera) else {return}
        capturesession.addInput(inputdevice)
        
  
        
        /*let previewlayer = AVCaptureVideoPreviewLayer(session: capturesession)
        previewlayer.videoGravity = AVLayerVideoGravity.resizeAspect
        previewlayer.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
        previewlayer.frame = CGRect(x: 0, y: 0, width: 400, height: 200)
        VideoPreviewView.layer.addSublayer(previewlayer)*/
        
       let previewLayer = AVCaptureVideoPreviewLayer(session: capturesession)
        view.layer.addSublayer(previewLayer)
     
  
        let videoOutput = AVCaptureVideoDataOutput()
     
        
            
        
        
        videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: "videoquueu"))
        capturesession.addOutput(videoOutput)
        capturesession.startRunning()

       
    }
    
    
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        
       let imagebuffer =  CMSampleBufferGetImageBuffer(sampleBuffer)
        let cameraimage = CIImage(cvPixelBuffer: imagebuffer!)
        
        DispatchQueue.main.async {
            self.VideoPreviewImageView.image = UIImage(ciImage: cameraimage)
           
           
        }
        
        
    }
    

    

}

[这是我当前在图像视图中的视频预览][1]:https://i.stack.imgur.com/bJNpD.jpg

我可以通过创建扩展来修复它

extension UIImage {
    
func fixOrientation() -> UIImage {
    if self.imageOrientation == UIImage.Orientation.up {
return self
}
UIGraphicsBeginImageContextWithOptions(self.size, false, self.scale)
    self.draw(in: CGRect(x:0,y: 0, width: self.size.width, height: self.size.height))
    let normalizedImage:UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext()
return normalizedImage;
}

并将方向设置为向右

UIImage(ciImage: filteredimage,scale: 1.0,orientation: .right).fixOrientation()

【问题讨论】:

    标签: ios swift uiimage core-image avkit


    【解决方案1】:

    UIImage 还有另一个构造函数,它也输入方向:

    UIImage(ciImage: cameraImage, scale: 1.0, orientation: orientation)
    

    所以你感兴趣的是如何确定方向。这取决于您要达到的目标的应用程序;一些应用程序被锁定在特定方向,而另一些应用程序会根据用户握持设备的方式改变方向。

    默认情况下,相机应处于两个横向方向之一。我希望设备方向是横向左侧(和用户界面方向横向右侧),因为这意味着用户自然应该将他的手机横向放置,主页按钮在右侧以拍照。该位置意味着设备处于横向左侧,而 UI 旋转为横向右侧(UI 旋转方式与设备不同,以便用户可以自然地看到它)。

    无论如何,您可以通过使用以下几个可能的属性之一来进行一些试验和错误来填写您的方向:

    • 设备:UIDevice.current.orientation 有点棘手,因为它也可以面朝下或面朝上
    • 状态栏:UIApplication.shared.statusBarOrientation 这个主要使用,但现在已弃用。它还使您对视图控制器界面方向支持的支持生效。它在某些情况下可用,但并非全部可用
    • 场景:self.view.window!.windowScene!.interfaceOrientation 我希望这是 statusBarOrientation 方法的替代品

    一旦您决定使用哪个作为基本方向,我建议您只需尝试使用 switch 语句的所有情况,并在构造它时对您的 UIImage 应用正确的旋转。比如:

    UIImage(ciImage: cameraImage, scale: 1.0, orientation: {
        switch UIDevice.current.orientation {
        case .landscapeRight: return .up
        case .landscapeLeft: return .down
        case .portrait: return .left
        case .portraitUpsideDown: return .right
        default: return .up
        }
    }())
    

    【讨论】:

    • 您好,感谢您的回复,但对我来说,我将应用设置为纵向,但使用 CIImage 时,相机视图为横向。这是我的屏幕截图i.stack.imgur.com/bJNpD.jpg
    • @stark 在我看来,在这种情况下,图像需要“向右”旋转。所以在最后一个片段中我添加了你应该交换肖像和肖像UpsideDown的值。或者如果您希望完全放弃设备方向,那么您可以简单地使用 .right 并且没有“switch”语句。
    • 感谢我能够修复它。我已经更新了我的解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-22
    • 2016-08-24
    • 2015-11-24
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2014-01-06
    相关资源
    最近更新 更多