I'm making a simple video capture app. I have used UIImageView as my preview layer as I may need to use CIFilter. But the problem is when image is converted from CIImage to UIImage and displayed in image view its orientation changes. How can I fix it
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)
}
}
}
[Here is my current video preview in image view][1]: https://i.stack.imgur.com/bJNpD.jpg
I was able to fix it by creating an extension
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;
}
And setting orientation to right
UIImage(ciImage: filteredimage,scale: 1.0,orientation: .right).fixOrientation()