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 } }
说明
- 前置相机拍摄的图片默认是水平镜像,先通过
.leftMirrored创建镜像图片 - 调用
fixOrientation()方法将图片方向修正为正常竖直方向,避免显示翻转 - 增加
cgImage的非空判断,提升代码容错性
内容的提问来源于stack exchange,提问作者Veera Manikandan
相关产品推荐
相关产品推荐

