2012-10-28 30 views
11

AVFoundation chỉ là tuyệt vời cho những người muốn có được bàn tay bẩn, nhưng vẫn còn rất nhiều thứ cơ bản không dễ dàng để tìm ra cách lưu hình ảnh được chụp từ thiết bị vào Photo AlbumLàm cách nào để lưu ảnh chụp bằng AVFoundation vào Photo Album?

Bất kỳ ý tưởng nào?

+0

Tôi đang làm điều đó, cảm ơn – RollRoll

+0

Dường như chủ đề này không liên quan đến Cocoa. –

Trả lời

62

Đây là hướng dẫn từng bước về cách chụp ảnh bằng cách sử dụng AVFoundation và lưu nó vào album ảnh.

Thêm một đối tượng UIView đến NIB (hoặc như là một subview), và tạo ra một @property trong điều khiển của bạn:

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

Nối UIView vào ổ cắm trên trong IB, hoặc gán nó trực tiếp nếu bạn' tái sử dụng mã thay vì một NIB.

Sau đó chỉnh sửa UIViewController của bạn, và cung cấp cho nó các viewDidAppear phương pháp sau đây:

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

Tạo mới @property để giữ một tham chiếu đến đối tượng đầu ra:

@property(nonatomic, retain) AVCaptureStillImageOutput *stillImageOutput; 

Sau đó tạo một UIImageView nơi chúng tôi sẽ hiển thị ảnh đã chụp. Thêm cái này vào NIB của bạn, hoặc lập trình.

Treo nó lên một số khác @property hoặc gán thủ công, ví dụ :;

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

Cuối cùng, hãy tạo UIButton để bạn có thể chụp ảnh.

Một lần nữa, thêm nó vào NIB của bạn (hoặc lập trình để màn hình của bạn), và móc nó lên đến phương pháp sau:

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

Bạn có thể phải nhập khẩu #import <ImageIO/CGImageProperties.h> cũng có.

Source. Ngoài ra, hãy kiểm tra this.

+2

chính xác những gì tôi cần – RollRoll

+1

Tôi sẽ đề nghị những người khác truy cập vào các trang web được liên kết trong bài đăng này. Họ cung cấp một cái nhìn sâu sắc hơn về những gì đang xảy ra. Bài đăng tuyệt vời, iDev! – bvd

+0

Đó là một câu trả lời vô giá, cảm ơn iDev! – Fattie

0

Có rất nhiều thứ để thiết lập máy ảnh theo cách mà bạn đang không thực hiện hoặc không hiển thị.

Nơi tốt nhất để xem xét là: AVCamCaptureManager.m trong dự án mẫu AVCam; đặc biệt là setupSessioncaptureStillImage (ghi ảnh vào thư viện).

1

Theo câu hỏi của bạn, có vẻ như bạn đã có hình ảnh từ máy ảnh vào NSData hoặc UIImage. Nếu vậy, bạn có thể thêm ảnh này vào album theo những cách khác nhau. Bản thân AVFoundation không có các lớp mang theo hình ảnh. Vì vậy, ví dụ, bạn có thể sử dụng khung ALAssetsLibrary để lưu hình ảnh vào Album ảnh. Hoặc bạn chỉ có thể sử dụng khung công tác UIKit với phương thức UIImageWriteToSavedPhotosAlbum. Cả hai đều tốt để sử dụng.

Trong trường hợp bạn vẫn chưa chụp được hình ảnh, bạn có thể xem phương pháp captureStillImageAsynchronouslyFromConnection của khung công tác AVFoundation. Dù sao, đây là những ý tưởng. Bạn có thể dễ dàng tìm thấy các ví dụ trên Internet. Chúc may mắn :)

0

Phương pháp này làm việc cho tôi

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

nơi appDelegate.library là ALAssetLibrary dụ.

+0

cảm ơn, nhưng làm cách nào bạn trích xuất UIImage từ thiết bị camera trước bằng AVFoundation? – RollRoll

Các vấn đề liên quan