2012-07-20 29 views
6

Tôi đang cố gắng để có được càng tốt một hình ảnh càng tốt từ camera, nhưng chỉ có thể tìm thấy ví dụ mà captureStillImageAsynchronouslyFromConnection và sau đó đi thẳng đến:captureStillImageAsynchronouslyFromConnection mà không JPG trung gian

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

JPEG là lossy và tất cả, là có cách nào để lấy dữ liệu dưới dạng PNG, hoặc thậm chí chỉ RGBA (BGRA, cái gì-có-bạn?). AVCaptureStillImageOutput dường như không có bất kỳ NSData * phương pháp khác ....

Trên thực tế nhìn vào CMSampleBufferRef, nó có vẻ như nó đã bị khóa như JPEG ~

formatDescription = <CMVideoFormatDescription 0xfe5e1f0 [0x3e5ac650]> { 
mediaType:'vide' 
mediaSubType:'jpeg' 
mediaSpecific: { 
    codecType: 'jpeg'  dimensions: 2592 x 1936 
} 
extensions: {(null)} 
} 

Có một số cách khác để có một ảnh có độ phân giải đầy đủ và nhận dữ liệu thô?

+0

Vậy làm cách nào để bạn nhận được dữ liệu cho PNG? Bạn có sử dụng kCVPixelFormatType_32BGRA thay vì kCMVideoCodecType_JPEG không? – Crashalot

+0

Có ~ https://github.com/blindsightcorp/rawphoto-ios/blob/master/RawPhoto/CaptureSessionManager.m –

+0

cảm ơn, nhưng dòng 167 cho thấy bạn sử dụng jpegStillImageNSDataRepresentation vẫn còn? làm thế nào để bạn chuyển đổi sang PNG? – Crashalot

Trả lời

10

Bạn sẽ cần đặt cài đặt đầu ra với định dạng pixel khác. Nếu bạn muốn 32-bit BGRA, ví dụ, bạn có thể thiết lập:

NSDictionary *outputSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA], (id)kCVPixelBufferPixelFormatTypeKey, nil]; 

Từ https://developer.apple.com/library/mac/#documentation/AVFoundation/Reference/AVCaptureStillImageOutput_Class/Reference/Reference.html, các "đề nghị" các định dạng điểm ảnh là:

  • kCMVideoCodecType_JPEG
  • kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
  • kCVPixelFormatType_32BGRA

Tất nhiên, nếu bạn không sử dụng JPEG outp ut, bạn không thể sử dụng jpegStillImageNSDataRepresentation:, nhưng có một ví dụ ở đây: how to convert a CVImageBufferRef to UIImage

+0

Wow. Tôi nên có chỉ cần cố gắng đó, mặc dù 'availableImageDataCodecTypes' nói rằng chỉ có jpeg đã có sẵn. Tôi cho rằng những người khác không phải là codec, do đó, có ý nghĩa. Hạnh phúc hơn. Cảm ơn! :) –

+0

Vì vậy, nếu bạn muốn PNG thay vì đầu ra JPEG, bạn sử dụng kCVPixelFormatType_32BGRA và sau đó sử dụng một trong các câu trả lời để chuyển đổi từ CVImageBufferRef sang UIImage? Cảm ơn! – Crashalot

0

Chỉ cần thay đổi các thiết lập đầu ra kết nối của bạn:

outputSettings Các thiết lập nén cho đầu ra.

@property(nonatomic, copy) NSDictionary *outputSettings 

Bạn có thể truy xuất một NSDictionary trong những giá trị được hỗ trợ với

availableImageDataCodecTypes Các định dạng codec hình ảnh được hỗ trợ có thể được quy định tại outputSettings. (chỉ đọc)

@property(nonatomic, readonly) NSArray *availableImageDataCodecTypes 
+0

Một AVCaptureStillImageOutput mới tạo ra một mảng với một mục cho các tệpImageDataCodecTypes sẵn có: (jpeg). Điều đó có nghĩa là tôi chỉ hoàn toàn SOL cho "full res"? –

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