Domanda

Sto usando il seguente codice per salvare un fotogramma di un filmato al mio desktop:

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

Al secondo ultima riga di codice, ricevo il seguente messaggio nella console, senza alcun risultato essere salvato sul desktop:

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

Il NSImage è ancora un oggetto assegnato per l'intera chiamata al metodo, quindi non sono sicuro perché sto ricevendo denunce di insufficiente quantità di immagini.

Apprezzerei tutto l'aiuto. Grazie in anticipo, Ricky.

È stato utile?

Soluzione

Credo che la fonte del problema è che si sta passando un array di oggetti NSCIImageRep a representationOfImageRepsInArray: usingType:. :, proprietà che credo si aspetta un array di oggetti NSBitmapImageRep

Che cosa si vuole fare è creare un NSBitmapImageRep dal CIImage. Quindi è possibile utilizzare che per scrivere su disco. Che sarebbe grosso modo:

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

Naturalmente, che ci si vuole gestire eventuali casi di errore e, probabilmente, passare una proprietà del dizionario per mettere a punto la creazione JPEG.

Altri suggerimenti

Mi dispiace non so il motivo per cui il codice non funziona, ma si avvicina in un modo diverso (e penso in modo più efficiente di quanto il tuo CVImageBuffer a CIImage a NSCIImageRep a NSImage a NSData, anche se ad un leggermente inferiore livello): -

  1. CVImageBuffer a CGImage
  2. CGImage in file jpg

Non ho il codice già pronto per fare questo, ma estraendo la stoffa giusta da questi esempi dovrebbe essere semplice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top