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.

Foi útil?

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): -

  1. CvImageBuffer para cGimage
  2. CGIMAGE para o arquivo JPG

Não tenho o código pronto para fazer isso, mas extrair as coisas certas desses exemplos deve ser direto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top