UIImagePickerController中的前置摄像头

din*_*nna 64 iphone objective-c uiimagepickercontroller ios swift

我正在开发iPad2中的前置摄像头应用程序UIImagePickerController.

当我捕捉到图像时,它显示为从左向右翻转.

我该如何纠正?

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) 
    {
        UIImagePickerController *imgPkr = [[UIImagePickerController alloc] init];
        imgPkr.delegate = self;
        imgPkr.sourceType = UIImagePickerControllerSourceTypeCamera;
        imgPkr.cameraDevice=UIImagePickerControllerCameraDeviceFront;


        UIImageView *anImageView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"select%d.png",val]]];
        anImageView.frame = CGRectMake(0, 0, anImageView.image.size.width, anImageView.image.size.height);
        imgPkr.cameraOverlayView = anImageView;
        [theApp.TabViewControllerObject presentModalViewController:imgPkr animated:YES];
        [imgPkr release];
    }
Run Code Online (Sandbox Code Playgroud)

Ind*_*ore 75

您可以使用此方法从源图像中翻转图像

UIImage *flippedImage = [UIImage imageWithCGImage:picture.CGImage scale:picture.scale orientation:UIImageOrientationLeftMirrored];
Run Code Online (Sandbox Code Playgroud)

编辑:添加了快速代码

let flippedImage = UIImage(CGImage: picture.CGImage, scale: picture.scale, orientation:.LeftMirrored)
Run Code Online (Sandbox Code Playgroud)


Yon*_*zer 19

我遇到了同样的问题 - 上面的解决方案只给我一半的答案,因为用户必须先批准镜像,然后才能进入我的应用程序的下一页 - 我在翻转后使用捕获的图像.

为了解决这个问题,每当我切换到前置摄像头时,我都必须翻转摄像机视图:

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

只是为了扩展这个伟大的答案,一些典型的完整代码,Dec2013,iOS7/Xcode5.做一切.你只需要一个图标(示例中为cameraToggle.PNG).

-(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];
    }
Run Code Online (Sandbox Code Playgroud)


Luc*_*rdo 10

正如其他答案,我遇到了同样的问题.正如Yonatan Betzer所提到的,只是翻转最终图像只是答案的一半,因为预览图像由UIPickerController显示,当你用前置摄像头拍照时,它仍然是倒置的(镜像).

Yonatan Betzer的anwser工作得很好,但他没有提到如何或在哪里采取行动改变相机设备.

基于互联网的一些代码,我创建了一个Pod来获得这个想要的行为:

https://github.com/lucasecf/LEMirroredImagePicker

安装完成后,您只需要将这两行代码与您的代码一起调用UIImagePickerController:

self.mirrorFrontPicker = [[LEMirroredImagePicker alloc] initWithImagePicker:pickerController];
[self.mirrorFrontPicker mirrorFrontCamera];
Run Code Online (Sandbox Code Playgroud)

就是这样,就像那样.您可以在github链接的README中查看更多信息.


Dar*_*ren 6

只是为了添加我刚刚实现这一点而没有继承UIImagePickerController并且不向摄像机视图添加额外按钮.

只需监听此通知,无论何时更换相机,都会多次触发:

[[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(cameraChanged:)
                                                 name:@"AVCaptureDeviceDidStartRunningNotification"
                                               object:nil];
Run Code Online (Sandbox Code Playgroud)

然后使用此方法翻转摄像机视图:

- (void)cameraChanged:(NSNotification *)notification
{
    if(imagePicker.cameraDevice == UIImagePickerControllerCameraDeviceFront)
    {
        imagePicker.cameraViewTransform = CGAffineTransformIdentity;
        imagePicker.cameraViewTransform = CGAffineTransformScale(imagePicker.cameraViewTransform, -1,     1);
    } else {
        imagePicker.cameraViewTransform = CGAffineTransformIdentity;
    }
}
Run Code Online (Sandbox Code Playgroud)


bar*_*dog 6

我知道这个问题很老,但似乎这仍是一个常见的问题.只需在对象CGAffineTransform上设置cameraViewTransform属性即可UIImagePickerController.

let picker = UIImagePickerController()
picker.cameraViewTransform = CGAffineTransformScale(picker.cameraViewTransform, -1, 1)
Run Code Online (Sandbox Code Playgroud)


小智 5

为 swift 4 更新了“bandog”答案

let picker = UIImagePickerController()
picker.cameraViewTransform = picker.cameraViewTransform.scaledBy(x: -1, y: 1)
Run Code Online (Sandbox Code Playgroud)