Jak zapisać zdjęcia zrobione za pomocą AVFoundation do albumu fotograficznego?

AVFoundation jest po prostu świetny dla tych, którzy chcą pobrudzić sobie ręce, ale nadal jest wiele podstawowych rzeczy, które nie są łatwe do zrozumienia, jak zapisać zdjęcia zrobione z urządzenia do albumu fotograficznego

Jakieś pomysły?

Author: iDev, 2012-10-28

4 answers

Oto samouczek krok po kroku, jak przechwycić obraz za pomocą AVFoundation i zapisać go do albumu fotograficznego.

Dodaj obiekt UIView do NIB (lub jako subview) i utwórz @property w kontrolerze:

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

Podłącz {[6] } do gniazdka powyżej w IB, lub przypisać go bezpośrednio, jeśli używasz kodu zamiast stalówki.

Następnie Edytuj swój UIViewController i nadaj mu następującą metodę viewDidAppear:

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

Utwórz nowy @property, aby trzymać odniesienie do wyjścia obiekt:

@property(nonatomic, retain) AVCaptureStillImageOutput *stillImageOutput;

Następnie zrób UIImageView gdzie będziemy wyświetlać zrobione zdjęcie. Dodaj to do swojej stalówki lub programowo.

Podłącz go do innego @property, lub przypisz ręcznie, np.;

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

Na koniec utwórz UIButton, abyś mógł zrobić zdjęcie.

Ponownie dodaj go do stalówki (lub programowo do ekranu) i podłącz do następującej metody:

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

Być może będziesz musiał również zaimportować #import <ImageIO/CGImageProperties.h>.

Źródło . Sprawdź też to .

 62
Author: iDev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-01 05:46:13

Zgodnie z twoim pytaniem, wygląda na to, że masz już zdjęcie z aparatu do Nsdata lub UIImage. Jeśli tak, możesz dodać to zdjęcie do albumu na różne sposoby. Sama AVFoundation nie ma klas, które przenoszą obrazy. Na przykład możesz użyć frameworka ALAssetsLibrary , aby zapisać obraz w albumie zdjęć. Możesz też użyć tylko frameworka UIKit z jego metodą UIImageWriteToSavedPhotosAlbum . Oba są dobre do użyj.

W przypadku, gdy nie masz jeszcze zarejestrowanego obrazu, możesz spojrzeć na metodę capturatillimageasynchronouslyfromconnection frameworka AVFoundation. W każdym razie, oto pomysły. Przykłady można łatwo znaleźć w Internecie. Powodzenia:)

 1
Author: lonlywolf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-02 14:40:18

Jest wiele do Ustawienia kamery w ten sposób, że albo nie robisz lub nie pokazujesz.

Najlepszym miejscem do spojrzenia byłoby: AVCamCaptureManager.m w przykładowym projekcie AVCam; szczególnie setupSession i captureStillImage (który zapisuje zdjęcie do biblioteki).

 0
Author: lnafziger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-28 05:24:26

Ta metoda działa dla mnie

-(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");
    }
}];
}

Gdzie appDelegate.Biblioteka jest instancją ALAssetLibrary.

 0
Author: Timur Mustafaev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-11-02 14:55:01