web-dev-qa-db-fra.com

iOS prenant des photos par programmation

Je sais que c'est possible, vu cela dans certaines applications (iGotYa est, je crois, le plus célèbre) . Je sais comment tout mettre en place pour prendre des photos, les sauvegarder et tout . Mais comment peut-on le faire par programme ? Il suffit à l'utilisateur de cliquer sur un bouton (dans le contrôleur de vue standard) pour qu'il prenne automatiquement une photo à l'aide de la caméra frontale et l'enregistre (ou non, le fait simplement de l'obtenir sous la forme d'un UIImage).

Merci!

27
La bla bla

C’est très simple, utilisez simplement le guide de référence AVFoundation:

https://developer.Apple.com/library/ios/#documentation/AudioVideo/Conceptual/AVFoundationPG/Articles/04_MediaCapture.html

Si vous ne voulez pas que l'utilisateur voie l'entrée de prévisualisation, vous pouvez simplement ignorer la partie de la couche de prévisualisation définie du code.

Edit: Pour être plus détaillé.

1) Vous définissez votre configuration de capture à l’aide de AVFoundation.

  • Réglez l'entrée de l'appareil photo sur frontal, éteignez le flash, etc.

2) Vous passez à la partie où la couche d'aperçu vidéo est définie.

3) Vous appelez la méthode captureStillImageAsynchronouslyFromConnection: completionHandler: chaque fois que vous souhaitez que la photo soit prise.

Remarque: si vous souhaitez que le flash ne soit pas entendu, vous risquez de ne pas respecter les droits de l'utilisateur dans certains pays (au Japon, par exemple). Une solution de contournement que je connaisse consiste à capturer une image d'une vidéo (ne déclenche pas le flash).

22
Pochi

Vous pouvez aussi le faire sans AVFoundation et c'est à mon avis un moyen plus simple de le mettre en oeuvre en utilisant uniquement le UIImagePickerController .

  1. De toute évidence, l'appareil doit avoir une caméra
  2. Vous devez masquer les commandes de la caméra
  3. Ensuite, utilisez simplement la méthode takePicture de UIImagePickerController

Vous trouverez ci-dessous un exemple simple à déclencher après un bouton-poussoir.

- (IBAction)takePhoto:(id)sender 
{
    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;
    picker.cameraDevice = UIImagePickerControllerCameraDeviceFront;
    picker.showsCameraControls = NO;
    [self presentViewController:picker animated:YES
                     completion:^ {
                         [picker takePicture];
                     }];
}
15
GrandSteph

VLBCameraView est une bibliothèque qui utilise AVFoundation pour prendre des photos. 

Un aperçu apparaît dans la vue, que vous pouvez ensuite appeler par méthode VLBCameraView # takePicture par programme pour prendre une photo.

Livré avec CocoaPods.

2
samwize

Dans le fichier .h

@interface ABCViewController : UIViewController

@property (strong, nonatomic) IBOutlet UIImageView *imageView;

- (IBAction)takePhoto:  (UIButton *)sender;
- (IBAction)selectPhoto:(UIButton *)sender;

@end

Dans le fichier .m

@interface ABCViewController : UIViewController <UIImagePickerControllerDelegate, UINavigationControllerDelegate>

- (IBAction)takePhoto:(UIButton *)sender {


if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {

        UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Error"
                                                        message:@"Device has no camera"
                                                        delegate:nil
                                                        cancelButtonTitle:@"OK"
                                                        otherButtonTitles: nil];

        [myAlertView show];

    } else {

    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = YES;
    picker.sourceType = UIImagePickerControllerSourceTypeCamera;

    [self presentViewController:picker animated:YES completion:NULL];

}

}

- (IBAction)selectPhoto:(UIButton *)sender {

    UIImagePickerController *picker = [[UIImagePickerController alloc] init];
    picker.delegate = self;
    picker.allowsEditing = YES;
    picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

    [self presentViewController:picker animated:YES completion:NULL];


}

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
    self.imageView.image = chosenImage;

    [picker dismissViewControllerAnimated:YES completion:NULL];

}


- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {

    [picker dismissViewControllerAnimated:YES completion:NULL];

}
1
Nischal Hada

Voici le code pour Objective -C Custom Camera. Vous pouvez ajouter des fonctionnalités, boutons selon votre souhait.

#import "CustomCameraVC.h"

@interface CustomCameraVC ()  {
    BOOL frontCamera;
}
@property (strong,nonatomic) AVCaptureSession *captureSession;
@property (strong,nonatomic) AVCaptureStillImageOutput *stillImageOutput;
@property (strong,nonatomic) AVCaptureVideoPreviewLayer *videoPreviewLayer;
@property (weak, nonatomic) IBOutlet UIView *viewCamera;


@end

@implementation CustomCameraVC

- (void)viewDidLoad {
    [super viewDidLoad];        
}

-(void)viewWillAppear:(BOOL)animated  {
    [super viewWillAppear:YES];
    frontCamera = NO;
    [self showCameraWithFrontCamera:frontCamera];

}

-(void)showCameraWithFrontCamera:(BOOL)flag {
    self.captureSession = [[AVCaptureSession alloc]init];
    self.captureSession.sessionPreset = AVCaptureSessionPresetPhoto;
    AVCaptureDevice *captureDevice;
    if(flag)  {
      captureDevice= [self frontCamera];
    }
    else {
      captureDevice= [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    }
    NSError *error = nil;
    AVCaptureDeviceInput *input =   [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];

    [self.captureSession addInput:input];
    self.stillImageOutput = [AVCaptureStillImageOutput new];
    self.stillImageOutput.outputSettings = @{AVVideoCodecKey:AVVideoCodecJPEG};
    [self.captureSession addOutput:_stillImageOutput];
    self.videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];

    self.videoPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
    self.videoPreviewLayer.connection.videoOrientation = AVCaptureVideoOrientationPortrait;
    [self.viewCamera.layer addSublayer:self.videoPreviewLayer];
    [self.captureSession startRunning];
    self.videoPreviewLayer.frame = self.viewCamera.bounds;
}


- (AVCaptureDevice *)frontCamera {
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    for (AVCaptureDevice *device in devices) {
        if ([device position] == AVCaptureDevicePositionFront) {
            return device;
        }
    }
    return nil;
}


- (IBAction)btnCaptureImagePressed:(id)sender {

     AVCaptureConnection * videoConnection =  [_stillImageOutput connectionWithMediaType:AVMediaTypeVideo];

    [_stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler:^(CMSampleBufferRef  _Nullable sampleBuffer, NSError * _Nullable error) {
       NSData *imageData =  [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:sampleBuffer];
        UIImage *image = [[UIImage alloc]initWithData: imageData];
        UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil);
    }];

}

@end
0
varender singh