From 02181ead9e59984f4d348003a96e6dee63126c50 Mon Sep 17 00:00:00 2001 From: Ilya Laktyushin Date: Tue, 30 Sep 2025 01:15:19 +0400 Subject: [PATCH] Fix frontal camera photo orientation on iPad --- submodules/Camera/Sources/CameraUtils.swift | 30 +++++++++----- .../Camera/Sources/PhotoCaptureContext.swift | 40 +++++-------------- 2 files changed, 30 insertions(+), 40 deletions(-) diff --git a/submodules/Camera/Sources/CameraUtils.swift b/submodules/Camera/Sources/CameraUtils.swift index 5956cb534c..4ae93e883e 100644 --- a/submodules/Camera/Sources/CameraUtils.swift +++ b/submodules/Camera/Sources/CameraUtils.swift @@ -188,16 +188,26 @@ extension CameraPreviewView.Rotation { } } -func exifOrientationForDeviceOrientation(_ deviceOrientation: UIDeviceOrientation) -> CGImagePropertyOrientation { - switch deviceOrientation { - case .portraitUpsideDown: - return .rightMirrored - case .landscapeLeft: - return .downMirrored - case .landscapeRight: - return .upMirrored - default: - return .leftMirrored +func exifOrientation(for orientation: AVCaptureVideoOrientation, mirror: Bool) -> Int32 { + switch (orientation, mirror) { + case (.portrait, false): + return 6 + case (.portrait, true): + return 5 + case (.portraitUpsideDown, false): + return 8 + case (.portraitUpsideDown, true): + return 7 + case (.landscapeLeft, false): + return 3 + case (.landscapeLeft, true): + return 2 + case (.landscapeRight, false): + return 1 + case (.landscapeRight, true): + return 4 + @unknown default: + return 6 } } diff --git a/submodules/Camera/Sources/PhotoCaptureContext.swift b/submodules/Camera/Sources/PhotoCaptureContext.swift index 2f2e775388..c61fe73602 100644 --- a/submodules/Camera/Sources/PhotoCaptureContext.swift +++ b/submodules/Camera/Sources/PhotoCaptureContext.swift @@ -58,36 +58,16 @@ final class PhotoCaptureContext: NSObject, AVCapturePhotoCaptureDelegate { print("Error occurred while capturing photo: Missing pixel buffer (\(String(describing: error)))") return } - - var photoFormatDescription: CMFormatDescription? - CMVideoFormatDescriptionCreateForImageBuffer(allocator: kCFAllocatorDefault, imageBuffer: photoPixelBuffer, formatDescriptionOut: &photoFormatDescription) - - var orientation: UIImage.Orientation = .right - if self.orientation == .landscapeLeft { - orientation = .down - } else if self.orientation == .landscapeRight { - orientation = .up - } else if self.orientation == .portraitUpsideDown { - orientation = .left - } - - let finalPixelBuffer = photoPixelBuffer - let renderedCIImage = CIImage(cvImageBuffer: finalPixelBuffer) - if let cgImage = self.ciContext.createCGImage(renderedCIImage, from: renderedCIImage.extent) { - var image = UIImage(cgImage: cgImage, scale: 1.0, orientation: orientation) - if image.imageOrientation != .up { - UIGraphicsBeginImageContextWithOptions(image.size, true, image.scale) - if self.mirror, let context = UIGraphicsGetCurrentContext() { - context.translateBy(x: image.size.width / 2.0, y: image.size.height / 2.0) - context.scaleBy(x: -1.0, y: 1.0) - context.translateBy(x: -image.size.width / 2.0, y: -image.size.height / 2.0) - } - image.draw(in: CGRect(origin: .zero, size: image.size)) - if let currentImage = UIGraphicsGetImageFromCurrentImageContext() { - image = currentImage - } - UIGraphicsEndImageContext() - } + + //if let value = photo.metadata[kCGImagePropertyOrientation as String] as? NSNumber { + // orientation = value.int32Value + //} else { + let orientation = exifOrientation(for: self.orientation, mirror: self.mirror) + //} + + let ci = CIImage(cvImageBuffer: photoPixelBuffer).oriented(forExifOrientation: orientation) + if let cgImage = self.ciContext.createCGImage(ci, from: ci.extent) { + let image = UIImage(cgImage: cgImage, scale: 1.0, orientation: .up) self.pipe.putNext(.finished(image, nil, CACurrentMediaTime())) } else { self.pipe.putNext(.failed)