2012-07-20 11 views
6

que estoy tratando de conseguir tan buena como sea posible una imagen de la cámara, pero sólo puedo encontrar ejemplos que captureStillImageAsynchronouslyFromConnection y luego ir directamente a:captureStillImageAsynchronouslyFromConnection sin JPG intermediario

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

JPEG estar con pérdida y todo, es hay alguna manera de obtener los datos como PNG, o incluso simplemente RGBA (BGRA, ¿qué-tienes-tú?). AVCaptureStillImageOutput no parecen tener ningún otro NSData * métodos ....

En realidad mirando el CMSampleBufferRef, parece que ya está bloqueado como JPEG ~

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

¿Hay alguna otra manera de tomar una imagen de resolución completa y obtener los datos sin procesar?

+0

Entonces, ¿cómo terminó obteniendo los datos para PNG? ¿Acabas de usar kCVPixelFormatType_32BGRA en lugar de kCMVideoCodecType_JPEG? – Crashalot

+0

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

+0

gracias, pero la línea 167 muestra que todavía está usando jpegStillImageNSDataRepresentation? ¿Cómo se convierte a PNG? – Crashalot

Respuesta

10

Deberá establecer las configuraciones de salida con un formato de píxel diferente. Si quieres 32 bits BGRA, por ejemplo, se puede establecer:

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

De https://developer.apple.com/library/mac/#documentation/AVFoundation/Reference/AVCaptureStillImageOutput_Class/Reference/Reference.html, los formatos de píxel "recomendados" son:

  • kCMVideoCodecType_JPEG
  • kCVPixelFormatType_420YpCbCr8BiPlanarFullRange
  • kCVPixelFormatType_32BGRA

Por supuesto, si no está usando JPEG outp ut, no puede usar jpegStillImageNSDataRepresentation:, pero hay un ejemplo aquí: how to convert a CVImageBufferRef to UIImage

+0

Wow. Debería haberlo intentado, a pesar de 'availableImageDataCodecTypes' que decía que solo estaba disponible jpeg. Supongo que los otros no son códecs, así que tiene sentido. Más feliz. ¡Gracias! :) –

+0

Entonces, si quiere PNG en lugar de salida JPEG, usa kCVPixelFormatType_32BGRA y luego usa una de las respuestas para convertir de CVImageBufferRef a UIImage? ¡Gracias! – Crashalot

0

basta con cambiar los ajustes de salida de la conexión:

OutputSettings los ajustes de compresión para la salida.

@property(nonatomic, copy) NSDictionary *outputSettings 

Usted puede retreive un NSDictionary de los valores admitidos con

availableImageDataCodecTypes Los formatos de codec de imagen compatibles que se pueden especificar en OutputSettings. (solo lectura)

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

Un AVCaptureStillImageOutput recién creado da una matriz con un elemento para AvailableDataCodecTypes disponibles: (jpeg). ¿Eso significa que estoy completamente SOL para "full res"? –