You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 5中如何修正UIImagePickerController预览视图的自拍镜像问题

解决前置相机自拍图片翻转问题

你的代码中对前置相机图片的镜像处理未结合图片本身的方向信息,导致出现翻转异常。可以通过以下方式修正:

修改 imagePickerController 代理方法

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
    guard let originalImage = info[.originalImage] as? UIImage else {
        picker.dismiss(animated: true)
        return
    }
    
    var correctedImage: UIImage
    if picker.cameraDevice == .front {
        // 前置相机拍摄的图片默认是镜像状态,需结合方向信息修正
        if let cgImage = originalImage.cgImage {
            // 创建镜像图片并沿用原图的缩放比例
            correctedImage = UIImage(cgImage: cgImage, scale: originalImage.scale, orientation: .leftMirrored)
            // 进一步修正图片方向,确保显示正常
            correctedImage = correctedImage.fixOrientation()
        } else {
            correctedImage = originalImage
        }
    } else {
        correctedImage = originalImage
        print("back")
    }
    
    // 此处可使用修正后的correctedImage进行后续操作
    // ...
    
    picker.dismiss(animated: true)
}

添加UIImage扩展修正图片方向

为确保图片方向完全正确,添加一个UIImage扩展方法:

extension UIImage {
    func fixOrientation() -> UIImage {
        guard imageOrientation != .up else { return self }
        
        var transform = CGAffineTransform.identity
        
        switch imageOrientation {
        case .down, .downMirrored:
            transform = transform.translatedBy(x: size.width, y: size.height)
            transform = transform.rotated(by: .pi)
        case .left, .leftMirrored:
            transform = transform.translatedBy(x: size.width, y: 0)
            transform = transform.rotated(by: .pi / 2)
        case .right, .rightMirrored:
            transform = transform.translatedBy(x: 0, y: size.height)
            transform = transform.rotated(by: -.pi / 2)
        case .up, .upMirrored:
            break
        @unknown default:
            break
        }
        
        switch imageOrientation {
        case .upMirrored, .downMirrored:
            transform = transform.translatedBy(x: size.width, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)
        case .leftMirrored, .rightMirrored:
            transform = transform.translatedBy(x: size.height, y: 0)
            transform = transform.scaledBy(x: -1, y: 1)
        case .up, .down, .left, .right:
            break
        @unknown default:
            break
        }
        
        if let cgImage = cgImage, let colorSpace = cgImage.colorSpace {
            let context = CGContext(data: nil, width: Int(size.width), height: Int(size.height), bitsPerComponent: cgImage.bitsPerComponent, bytesPerRow: 0, space: colorSpace, bitmapInfo: cgImage.bitmapInfo.rawValue)
            context?.concatenate(transform)
            
            switch imageOrientation {
            case .left, .leftMirrored, .right, .rightMirrored:
                context?.draw(cgImage, in: CGRect(x: 0, y: 0, width: size.height, height: size.width))
            default:
                context?.draw(cgImage, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
            }
            
            if let correctedCGImage = context?.makeImage() {
                return UIImage(cgImage: correctedCGImage)
            }
        }
        
        return self
    }
}

说明

  1. 前置相机拍摄的图片默认是水平镜像,先通过.leftMirrored创建镜像图片
  2. 调用fixOrientation()方法将图片方向修正为正常竖直方向,避免显示翻转
  3. 增加cgImage的非空判断,提升代码容错性

内容的提问来源于stack exchange,提问作者Veera Manikandan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 23:00:56