Pregunta

Estoy utilizando el código siguiente para guardar un fotograma de una película a mi escritorio:

NSCIImageRep *imageRep = [NSCIImageRep imageRepWithCIImage:[CIImage imageWithCVImageBuffer:imageBuffer]];
NSImage *image = [[[NSImage alloc] initWithSize:[imageRep size]] autorelease];
[image addRepresentation:imageRep];
CVBufferRelease(imageBuffer);

NSArray *representations = [image representations];
NSData *bitmapData = [NSBitmapImageRep representationOfImageRepsInArray:representations usingType:NSJPEGFileType properties:nil];
[bitmapData writeToFile:@"/Users/ricky/Desktop/MyImage.jpeg" atomically:YES];

En la penúltima línea de código, recibo el siguiente mensaje en la consola, sin ningún resultado se guarda en el escritorio:

<Error>: CGImageDestinationFinalize image destination does not have enough images
CGImageDestinationFinalize failed for output type 'public.jpeg'

El NSImage sigue siendo un objeto asignado para toda la llamada al método, así que no estoy seguro de por qué estoy recibiendo quejas sobre la insuficiente cantidad de imágenes.

te agradecería cualquier ayuda. Gracias por adelantado, Ricky.

¿Fue útil?

Solución

Creo que el origen del problema es que estás pasando un array de objetos a NSCIImageRep representationOfImageRepsInArray: usingType:. :, propiedades que creo que espera una matriz de objetos NSBitmapImageRep

Lo que se quiere hacer es crear un NSBitmapImageRep de su CIImage. A continuación, puede utilizar eso para escribir en el disco. Eso sería más o menos:

CIImage *myImage = [CIImage imageWithCVImageBuffer:imageBuffer]; 
NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:myImage];
NSData *jpegData [bitmapRep representationUsingType:NSJPEGFileType properties:nil];
[jpegData writeToFile:@"/Users/ricky/Desktop/MyImage.jpeg" atomically:YES];

Por supuesto, usted querría para manejar los casos de error y probablemente pasar unas propiedades diccionario para afinar la creación JPEG.

Otros consejos

Lo siento, no se sabe muy bien por qué su código no funciona, pero acercarse a ella de una manera diferente (y creo que de manera más eficiente que su CVImageBuffer a CIImage a NSCIImageRep a NSImage a NSData, aunque a un poco más bajo nivel): -

  1. CVImageBuffer a CGImage
  2. CGImage de archivo jpg

No tengo código ya hecho para hacer esto, pero la extracción de la materia derecha de esos ejemplos debería ser sencillo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top