2012-03-14 15 views
26

So che questo è possibile, ho visto questo in alcune app (iGotYa credo sia il più famoso). So come impostare tutto per scattare foto, salvarlo e tutto. Ma come può essere fatto a livello di programmazione? basta che l'utente faccia clic su un pulsante (nel controller di visualizzazione normale) e automaticamente scatta una foto usando la fotocamera anteriore e salvandola (o meno, semplicemente ricevendo come UIImage)iOS scattare foto programmaticamente

Grazie!

+0

possibile duplicato del [iOS prendono foto] (http://stackoverflow.com/questions/5237941/ios-take-picture) – bryanmac

+3

'' metodo takePicture' di UIImagePickerController' è un modo. – FluffulousChimp

risposta

21

Questo è molto semplice, basta usare il AVFoundation guida di riferimento:

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

Se non si desidera che l'utente per vedere l'ingresso di anteprima si può semplicemente saltare la parte insieme anteprima strato di il codice.

Modifica: per essere più dettagliato.

1) È possibile impostare la configurazione di acquisizione utilizzando AVFoundation.

  • impostare l'ingresso telecamera per frontale, spegnere il flash ecc ecc

2) si ignora la parte in cui è impostato il livello di anteprima video.

3) Si chiama il metodo captureStillImageAsynchronouslyFromConnection: completionHandler: ogni volta che si desidera scattare la foto.

Nota: se si desidera che il flash non sia ascoltato e tale quindi si potrebbe violare i diritti dell'utente in alcuni paesi (Giappone ad esempio). Una soluzione che so di fare è catturare una cornice di un video (non fa scattare il flash).

+0

Perché l'immagine scattata è nera? Qualche idea? –

+0

l'app ha il permesso di utilizzare la fotocamera? (Penso che sia ora richiesto, ma non è sicuro) – Pochi

+0

sì .. L'app ha il permesso. –

2

VLBCameraView è una libreria che utilizza AVFoundation per scattare foto.

Nella vista viene visualizzata un'anteprima, che è possibile chiamare il metodo VLBCameraView # takePicture a livello di codice per scattare una foto.

Viene fornito con CocoaPods.

15

È anche possibile farlo senza AVFoundation ed è a mio parere un modo più semplice per implementarlo utilizzando solo UIImagePickerController. Ci sono 3 condizioni:

  1. Ovviamente il dispositivo ha bisogno di avere una macchina fotografica
  2. Si deve nascondere i controlli della fotocamera
  3. Poi basta utilizzare il metodo takePicture da UIImagePickerController

Qui di seguito è un semplice esempio che in genere si attiva dopo un pulsante push

- (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]; 
        }]; 
} 
+0

Anche 'self' dovrebbe adottare i protocolli' UINavigationControllerDelegate' e 'UIImagePickerControllerDelegate'. – gdros

+0

come posso spostare un altro VC senza fare clic su UsePhoto? Dopo aver scattato una foto –

1

In .h file

@interface ABCViewController : UIViewController 

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

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

@end 

In.file di

@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]; 

} 
0

Ecco m è il codice per l'obiettivo della macchina fotografica personalizzata -C. Puoi aggiungere funzionalità, pulsanti secondo il tuo desiderio.

#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 
Problemi correlati