2012-10-28 1 views

risposta

62

Ecco un tutorial passo passo su come acquisire un'immagine utilizzando AVFoundation e salvarlo nell'album fotografico.

aggiungere un oggetto UIView al pennino (o come una visualizzazione secondaria), e creare un @property nel controllore:

@property(nonatomic, retain) IBOutlet UIView *vImagePreview; 

Collegare il UIView alla presa sopra in IB, oppure assegnare direttamente se' re usando il codice invece di un NIB.

quindi modificare il vostro UIViewController, e dargli il viewDidAppear seguente metodo:

-(void)viewDidAppear:(BOOL)animated 
{ 
    AVCaptureSession *session = [[AVCaptureSession alloc] init]; 
    session.sessionPreset = AVCaptureSessionPresetMedium; 

    CALayer *viewLayer = self.vImagePreview.layer; 
    NSLog(@"viewLayer = %@", viewLayer); 

    AVCaptureVideoPreviewLayer *captureVideoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session]; 

    captureVideoPreviewLayer.frame = self.vImagePreview.bounds; 
    [self.vImagePreview.layer addSublayer:captureVideoPreviewLayer]; 

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; 

    NSError *error = nil; 
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; 
    if (!input) { 
     // Handle the error appropriately. 
     NSLog(@"ERROR: trying to open camera: %@", error); 
    } 
    [session addInput:input]; 

    stillImageOutput = [[AVCaptureStillImageOutput alloc] init]; 
    NSDictionary *outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys: AVVideoCodecJPEG, AVVideoCodecKey, nil]; 
    [stillImageOutput setOutputSettings:outputSettings]; 
    [session addOutput:stillImageOutput]; 

    [session startRunning]; 
} 

Creare un nuovo @property per contenere un riferimento all'oggetto di uscita:

@property(nonatomic, retain) AVCaptureStillImageOutput *stillImageOutput; 

poi fare una UIImageView in cui noi' ll visualizzerò la foto catturata. Aggiungi questo al tuo NIB, o programmaticamente.

Collegarlo a un altro @property oppure assegnarlo manualmente, ad esempio;

@property(nonatomic, retain) IBOutlet UIImageView *vImage; 

Infine, creare un UIButton, in modo da poter scattare la foto.

Anche in questo caso, aggiungerlo al tuo NIB (oa livello di programmazione per lo schermo), e collegarlo al seguente metodo:

-(IBAction)captureNow { 
    AVCaptureConnection *videoConnection = nil; 
    for (AVCaptureConnection *connection in stillImageOutput.connections) 
    { 
     for (AVCaptureInputPort *port in [connection inputPorts]) 
     { 
      if ([[port mediaType] isEqual:AVMediaTypeVideo]) 
      { 
       videoConnection = connection; 
       break; 
      } 
     } 
     if (videoConnection) 
      { 
       break; 
      } 
    } 

    NSLog(@"about to request a capture from: %@", stillImageOutput); 
    [stillImageOutput captureStillImageAsynchronouslyFromConnection:videoConnection completionHandler: ^(CMSampleBufferRef imageSampleBuffer, NSError *error) 
    { 
     CFDictionaryRef exifAttachments = CMGetAttachment(imageSampleBuffer, kCGImagePropertyExifDictionary, NULL); 
     if (exifAttachments) 
     { 
      // Do something with the attachments. 
      NSLog(@"attachements: %@", exifAttachments); 
     } else { 
      NSLog(@"no attachments"); 
      } 

     NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageSampleBuffer]; 
     UIImage *image = [[UIImage alloc] initWithData:imageData]; 

     self.vImage.image = image; 

     UIImageWriteToSavedPhotosAlbum(image, nil, nil, nil); 
    }]; 
} 

Potrebbe essere necessario importare #import <ImageIO/CGImageProperties.h> anche.

Source. Controlla anche this.

+2

esattamente ciò di cui avevo bisogno – RollRoll

+1

Raccomanderò vivamente ad altri di visitare i siti Web collegati in questo post. Danno una visione più profonda di ciò che sta accadendo. Ottimo post, iDev! – bvd

+0

È una risposta impagabile, grazie a iDev! – Fattie

0

C'è molto da configurare la fotocamera in questo modo che non stai facendo o non stai mostrando.

Il posto migliore per guardare sarebbe: AVCamCaptureManager.m nel progetto di esempio AVCam; in particolare setupSession e captureStillImage (che scrive la foto nella libreria).

1

Secondo la tua domanda, sembra che tu abbia già ottenuto l'immagine dalla videocamera in NSData o UIImage. Se è così, puoi aggiungere questa immagine all'album in modi diversi. La stessa AVFoundation non ha classi che portano la conservazione delle immagini. Quindi, ad esempio, è possibile utilizzare il framework ALAssetsLibrary per salvare l'immagine nell'album fotografico. Oppure puoi usare solo il framework UIKit con il suo metodo UIImageWriteToSavedPhotosAlbum. Entrambi sono buoni da usare.

Nel caso in cui non sia ancora stata acquisita l'immagine fissa, è possibile esaminare il metodo captureStillImageAsynchronouslyFromConnection del framework AVFoundation. Comunque, ecco le idee. È possibile trovare facilmente esempi in Internet. Buona fortuna :)

0

Questo metodo funziona per me

-(void) saveImageDataToLibrary:(UIImage *) image 
{ 
NSData *imageData = UIImageJPEGRepresentation(image, 1.0); 
[appDelegate.library writeImageDataToSavedPhotosAlbum:imageData metadata:nil completionBlock:^(NSURL *assetURL, NSError *error) 
{ 
    if (error) { 
     NSLog(@"%@",error.description); 
    } 
    else { 
     NSLog(@"Photo saved successful"); 
    } 
}]; 
} 

dove appDelegate.library è ALAssetLibrary esempio.

+0

grazie, ma come hai estratto UIImage dal dispositivo della fotocamera frontale usando AVFoundation? – RollRoll