从iPhone相机拍摄照片后,在预览中图像翻转了,我该如何翻转回来?

4

在我按下快门按钮拍照之后,我的应用程序中的图像预览会水平镜像。我知道它这样做是为了模仿一面镜子,但我不希望我的应用程序有这种行为。我希望它能像Instagram那样使用前置摄像头拍照而不进行翻转。我知道如何在拍照之后翻转照片:

UIImage * flippedImage = [UIImage imageWithCGImage:picture.CGImage scale:picture.scale orientation:UIImageOrientationLeftMirrored];

但我想翻转的是预览图像(与“重新拍摄”和“使用照片”一起显示的图像)。有什么想法吗?我认为我需要覆盖UIImagePicker类中的某些内容。

谢谢


你是否已经尝试过任何代码? - doptimusprime
我认为我需要覆盖UIImagePickerController类中的某些内容,也许我可以复制.m和.h文件并从中创建自定义类,然后使用它。但我不确定如何查看苹果公司的类文件。 - Kex
手机的方向会改变吗?例如,如果你把手机倒过来拿着? - Mats
如果您愿意使用自定义相机,请使用 https://github.com/Aevit/SCCaptureCamera 并在预览中更改翻转图像。 - Jageen
在编辑代码过程中遇到任何问题,请提出您的问题。 - Jageen
2个回答

2
我尝试了很多在stackoverlfow上描述的答案,但是它们都没有提供我想要的结果。要么整个UIImagePickerViewController被转换,所以相机不直观,不像照镜子,要么只有图像后来被转换,如你所描述的那样,这样做虽然可以正常工作,但是你会在中间得到一个错误的预览图像。所以我最终采用了这种方法,它肯定不是最佳实践,但在iOS8和9上可以工作,并给我需要的结果。

确保添加一个观察者以在捕获图像按钮被按下时收到通知:

NSNotificationCenter.defaultCenter().addObserver(self, selector: "photoTaken", name: "_UIImagePickerControllerUserDidCaptureItem", object: nil)

potoTaken方法中,您可以像这样查找预览图像并将其转换为您所期望的外观:
func photoTaken() {
        for subview in self.imagePicker.view.subviews {
            for subsubview in subview.subviews {
                for subsubsubview in subsubview.subviews {
                    for subsubsubsubview in subsubsubview.subviews {
                        for subsubsubsubsubview in subsubsubsubview.subviews {
                            for subsubsubsubsubsubview in subsubsubsubsubview.subviews {
                                for subsubsubsubsubsubsubview in subsubsubsubsubsubview.subviews {
                                    if subsubsubsubsubsubsubview.isKindOfClass(UIImageView) {
                                        subsubsubsubsubsubsubview.transform = CGAffineTransformScale(self.imagePicker.cameraViewTransform, -1, 1)
                                    }
                                }

                            }
                        }
                    }
                }
            }
        }
    }

在你的 didFinishPickingMediaWithInfo 代理中,在保存或显示图像之前再次翻转图像。

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {

            let flippedImage = UIImage(CGImage: pickedImage.CGImage!, scale: pickedImage.scale, orientation: .LeftMirrored)

            myCustomPhotoAlbum.sharedInstance.saveImage(flippedImage)
            self.imageView.image = flippedImage
        }

        self.dismissViewControllerAnimated(true, completion: nil)
    }

5
来吧,你可以用一个“while”替换它。 - Dmytro Rostopira

2
你可以优化代码,替换嵌套结构:
var subviews: [UIView] = [self.imagePicker.view]
while (!subviews.isEmpty) {
    let subview = subviews.removeFirst()
    subviews += subview.subviews
    if (subview.isKind(of: UIImageView.self)) {
        subview.transform = self.imagePicker.cameraViewTransform.scaledBy(x: -1, y: 1)
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接