Erro ao salvar NSIMAGE como NSDATA
-
22-09-2019 - |
Pergunta
Estou usando o código a seguir para salvar um quadro de um filme na minha área de trabalho:
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];
Na segunda última linha de código, recebo as seguintes mensagens no console, sem nenhum resultado sendo salvo na área de trabalho:
<Error>: CGImageDestinationFinalize image destination does not have enough images
CGImageDestinationFinalize failed for output type 'public.jpeg'
O NSImage ainda é um objeto alocado para toda a chamada do método, por isso não sei por que estou recebendo reclamações sobre quantidade insuficiente de imagens.
Eu apreciaria qualquer ajuda. Agradecemos antecipadamente, Ricky.
Solução
Eu acho que a fonte do problema é que você está passando uma variedade de objetos NSciimagerep para a representação do FIMAGEREPSINARRAY: USTTYTYPE: Propriedades:, que eu acredito esperar que uma matriz de objetos nsbitmapimagerep.
O que você deseja fazer é criar um nsbitmapimagerep a partir do seu CIIMAGE. Então você pode usar isso para gravar no disco. Isso seria aproximadamente:
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];
Obviamente, você deseja lidar com qualquer caso de erro e provavelmente passar um dicionário de propriedades para ajustar a criação do JPEG.
Outras dicas
Lamento não saber por que seu código não funciona, mas abordar de uma maneira diferente (e penso com mais eficiência do que o seu cvImageBuffer para criar para NSciimagerep para NSimage para nsdata, embora em um nível ligeiramente mais baixo): -
Não tenho o código pronto para fazer isso, mas extrair as coisas certas desses exemplos deve ser direto.