Front facing camera in UIImagePickerController

后端 未结 9 1229
暗喜
暗喜 2020-12-02 06:42

I am developing the front facing camera app in iPad2 by using the UIImagePickerController.

When I capture the image it\'s shows as flipped from left to

相关标签:
9条回答
  • 2020-12-02 07:35

    Updated "bandog" answer for swift 4

    let picker = UIImagePickerController()
    picker.cameraViewTransform = picker.cameraViewTransform.scaledBy(x: -1, y: 1)
    
    0 讨论(0)
  • 2020-12-02 07:40

    I had the same problem - and the solution above only got me half the answer, because the user had to approve the mirrored image before getting to the next page of my app - where I use the captured image after flipping it.

    To solve this I had to flip the camera view whenever I switch to the front facing camera:

    - (IBAction)flipCamera:(id)sender {
    if(cameraUI.cameraDevice == UIImagePickerControllerCameraDeviceFront)
    {
        cameraUI.cameraDevice = UIImagePickerControllerCameraDeviceRear;
    }
    else {
        cameraUI.cameraDevice = UIImagePickerControllerCameraDeviceFront;
    }
    cameraUI.cameraViewTransform = CGAffineTransformScale(cameraUI.cameraViewTransform, -1,     1);     
    }
    

    Just to expand on this great answer, some typical complete code, Dec2013, iOS7 / Xcode5. Does everything. You just need an icon (cameraToggle.PNG in the example).

    -(void)showTheDeviceCamera
        {
        if ( ! [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] )
            return;
    
        // self.cameraController is a UIImagePickerController
        self.cameraController = [[UIImagePickerController alloc] init];
        self.cameraController.delegate = (id)self;
        self.cameraController.mediaTypes = @[(NSString *)kUTTypeImage];
        self.cameraController.allowsEditing = YES;
        self.cameraController.sourceType = UIImagePickerControllerSourceTypeCamera;
        [self presentViewController:self.cameraController animated:YES completion:NULL];
    
    
            // Add front-rear toggle button MANUALLY, IF NECESSARY
            // (You seem to usually get it for free, on iPhone, but
            // need to add manually on an iPad.)
    
            UIView *buttonView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"cameraToggle"]];
            [buttonView sizeToFit];
    
            buttonView.userInteractionEnabled = YES;
            [self.cameraController.view addSubview:buttonView];
    
            UITapGestureRecognizer *tap =
                [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(_frontRearButtonClicked) ];
            tap.numberOfTapsRequired = 1;
            [buttonView addGestureRecognizer:tap];
    
            // we'll add it at the top right .. could be anywhere you want
            buttonView.center = CGPointMake(
                    self.cameraController.view.frame.size.width-buttonView.frame.size.width,
                    3.0 * buttonView.frame.size.height
                    );
    
        }
    
    -(void)_frontRearButtonClicked
        {
        [UIView transitionWithView:self.cameraController.view
            duration:1.0
            options:UIViewAnimationOptionAllowAnimatedContent | UIViewAnimationOptionTransitionFlipFromLeft
            animations:^{
                if ( self.cameraController.cameraDevice == UIImagePickerControllerCameraDeviceRear )
                    self.cameraController.cameraDevice = UIImagePickerControllerCameraDeviceFront;
                else
                    self.cameraController.cameraDevice = UIImagePickerControllerCameraDeviceRear;
            } completion:NULL];
        }
    
    0 讨论(0)
  • 2020-12-02 07:46

    Full Working Example in Swift, which answers to the initial question of this post (tested on an iPhone 5c using iOS 8.2):

            import UIKit
    
            class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UIActionSheetDelegate {
    
             @IBOutlet var myUIImageView: UIImageView!
    
             var myUIImagePickerController: UIImagePickerController!
    
             override func viewDidLoad() {
                 super.viewDidLoad()
             }
    
             override func viewWillAppear(animated: Bool) {
                 println("viewWillAppear(animated: Bool) method called.")
                 super.viewWillAppear(animated)
                 NSNotificationCenter.defaultCenter().removeObserver(self)
             }
    
             override func viewWillDisappear(animated: Bool) {
                 println("viewWillDisappear(animated: Bool) method called.")
                 super.viewWillDisappear(animated)
                 NSNotificationCenter.defaultCenter().addObserver(self, selector: "cameraChanged:", name: "AVCaptureDeviceDidStartRunningNotification", object: nil)
             }
    
             /* UIImagePickerControllerDelegate Section */
             func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
                  if(self.myUIImagePickerController.sourceType == UIImagePickerControllerSourceType.Camera) {
                     self.myUIImageView.image = info[UIImagePickerControllerEditedImage] as? UIImage
                  } else {
                     self.myUIImageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage
                  }
                  self.dismissViewControllerAnimated(true, completion: nil)
             }
    
            func imagePickerControllerDidCancel(picker: UIImagePickerController) {
                self.dismissViewControllerAnimated(true, completion: nil)
            }
    
            /*
            You can choose to use one of the UIResponder methods:
            touchesBegan, touchesMoved, touchesEnded etc, in order to detect the touch
            on the UIImageView.
            */
            override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
                let touch: UITouch? = touches.anyObject() as? UITouch
                if (touch?.view == myUIImageView) {
                    println("myUIImageView has been tapped by the user.")
                    self.takingAPictureUsingTheCamera()
                }
            }
    
            func takingAPictureUsingTheCamera() {
                self.myUIImagePickerController = UIImagePickerController()
                self.myUIImagePickerController.delegate = self // Set the delegate
                self.myUIImagePickerController.sourceType = UIImagePickerControllerSourceType.Camera
                self.myUIImagePickerController.cameraDevice = UIImagePickerControllerCameraDevice.Front
        //        self.myUIImagePickerController.editing = true
                self.myUIImagePickerController.allowsEditing = true
                self.presentViewController(self.myUIImagePickerController, animated: true, completion: nil)
            }
    
            func cameraChanged(notification: NSNotification) {
                 println("cameraChanged(notification: NSNotification) method called.")
                 self.myUIImagePickerController.cameraViewTransform = CGAffineTransformIdentity
                 if(self.myUIImagePickerController.cameraDevice == UIImagePickerControllerCameraDevice.Front){
                     self.myUIImagePickerController.cameraViewTransform = CGAffineTransformScale(self.myUIImagePickerController.cameraViewTransform, -1, 1)
                 }
            }
           }// End class
    
    0 讨论(0)
提交回复
热议问题