2013-03-22 3 views
3

Мне нужно получить UIImage от несжатый Данные изображения от CMSampleBufferRef. Я использую код:Захват еще UIImage без сжатия (из CMSampleBufferRef)?

captureStillImageOutput captureStillImageAsynchronouslyFromConnection:connection 
completionHandler:^(CMSampleBufferRef imageSampleBuffer, NSError *error) 
{ 
    // that famous function from Apple docs found on a lot of websites 
    // does NOT work for still images 
    UIImage *capturedImage = [self imageFromSampleBuffer:imageSampleBuffer]; 
} 

http://developer.apple.com/library/ios/#qa/qa1702/_index.html найти ссылку на imageFromSampleBuffer функции.

Но он не работает должным образом. :(

Существует jpegStillImageNSDataRepresentation:imageSampleBuffer метод, но он дает сжатые данные (хорошо, так как JPEG).

Как я могу получить UIImage, созданный с помощью самых сырых несжатых данных после захвата неподвижных изображений?

?

Может быть, я должен указать некоторые параметры для вывода видео Я в настоящее время использую те:

captureStillImageOutput = [[AVCaptureStillImageOutput alloc] init]; 
captureStillImageOutput.outputSettings = @{ (id)kCVPixelBufferPixelFormatTypeKey : @(kCVPixelFormatType_32BGRA) }; 

Я заметил, что выход имеет значение по умолчанию для AVVideoCodecKey, который AVVideoCodecJPEG. Его можно избежать каким-либо образом, или действительно ли это имеет значение при съемке неподвижного изображения?

Я нашел что-то там: Raw image data from camera like "645 PRO", но мне нужен только UIImage, без использования OpenCV или OGLES или другого третьего лица.

+0

Есть много подобных вопросов, с решениями здесь на SO. – Jeepston

+0

@Jeepston не смог найти никаких рабочих изображений для фотографий ... – dreamzor

ответ

6

Метод imageFromSampleBuffer действительно работает, я использую измененную его версию, но если я правильно помню, вам нужно установить правильное значение outputSettings. Я думаю, вам нужно установить ключ как kCVPixelBufferPixelFormatTypeKey и значение как kCVPixelFormatType_32BGRA.

Так, например:

NSString* key = (NSString*)kCVPixelBufferPixelFormatTypeKey;         
NSNumber* value = [NSNumber numberWithUnsignedInt:kCVPixelFormatType_32BGRA];     
NSDictionary* outputSettings = [NSDictionary dictionaryWithObject:value forKey:key]; 

[newStillImageOutput setOutputSettings:outputSettings]; 

EDIT

Я использую эти настройки принимать stillImages не видео. Является ли ваш sessionPreset AVCaptureSessionPresetPhoto? Там могут быть проблемы с этой

AVCaptureSession *newCaptureSession = [[AVCaptureSession alloc] init]; 
[newCaptureSession setSessionPreset:AVCaptureSessionPresetPhoto]; 

EDIT 2

Часть о сохранении его UIImage совпадает с одной из документации. Именно по этой причине я просил другие причины проблемы, но я думаю, что это просто хватало за соломинку. Существует другой способ, который я знаю, но для этого требуется OpenCV.

- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer{ 
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 

CVPixelBufferLockBaseAddress(imageBuffer, 0); 

void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer); 

// Get the number of bytes per row for the pixel buffer 
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
// Get the pixel buffer width and height 
size_t width = CVPixelBufferGetWidth(imageBuffer); 
size_t height = CVPixelBufferGetHeight(imageBuffer); 



// Create a device-dependent RGB color space 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

// Create a bitmap graphics context with the sample buffer data 
CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8, 
              bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 
// Create a Quartz image from the pixel data in the bitmap graphics context 
CGImageRef quartzImage = CGBitmapContextCreateImage(context); 
// Unlock the pixel buffer 
CVPixelBufferUnlockBaseAddress(imageBuffer,0); 


// Free up the context and color space 
CGContextRelease(context); 
CGColorSpaceRelease(colorSpace); 

// Create an image object from the Quartz image 
UIImage *image = [UIImage imageWithCGImage:quartzImage]; 

// Release the Quartz image 
CGImageRelease(quartzImage); 

return (image); 

} 

Я думаю, это не поможет вам, извините. Я не знаю достаточно, чтобы думать о других источниках для вашей проблемы.

+0

Используете ли вы 'imageFromSimpleBuffer' для получения данных из неподвижных изображений, а не видео? Если да, можете ли вы добавить свою измененную реализацию в свой ответ, пожалуйста? Мои настройки точно такие же, как у вас, посмотрите на второй блок кода в вопросе :) – dreamzor

+0

Прошу прощения, я должен был внимательно прочитать ваш вопрос. Я отредактировал свой ответ. – thomketler

+0

Спасибо, конечно, это такой пресет и т. Д. Можете ли вы отправить свою реализацию imageFromSimpleBuffer, чтобы я мог попробовать? – dreamzor

1

Вот более эффективный способ:

UIImage *image = [UIImage imageWithData:[self imageToBuffer:sampleBuffer]]; 

- (NSData *) imageToBuffer:(CMSampleBufferRef)source { 
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(source); 
    CVPixelBufferLockBaseAddress(imageBuffer,0); 

    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    size_t width = CVPixelBufferGetWidth(imageBuffer); 
    size_t height = CVPixelBufferGetHeight(imageBuffer); 
    void *src_buff = CVPixelBufferGetBaseAddress(imageBuffer); 

    NSData *data = [NSData dataWithBytes:src_buff length:bytesPerRow * height]; 

    CVPixelBufferUnlockBaseAddress(imageBuffer, 0); 
    return data; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^