Ошибка сохранения NSImage как NSData - PullRequest
0 голосов
/ 26 февраля 2010

Я использую следующий код для сохранения кадра фильма на рабочем столе:

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

Во второй последней строке кода я получаю следующие сообщения в консоли, но результат не сохраняется на рабочем столе:

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

NSImage по-прежнему является выделенным объектом для всего вызова метода, поэтому я не уверен, почему я получаю жалобы на недостаточное количество изображений.

Буду признателен за любую помощь. Заранее спасибо, Рикки.

Ответы [ 2 ]

3 голосов
/ 26 февраля 2010

Я думаю, что источником проблемы является то, что вы передаете массив объектов NSCIImageRep в presentationOfImageRepsInArray: usingType: properties:, который, как я считаю, ожидает массив объектов NSBitmapImageRep.

То, что вы хотите сделать, это создать NSBitmapImageRep из вашего CIImage. Затем вы можете использовать это для записи на диск. Это было бы примерно:

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

Конечно, вы хотите обрабатывать любые случаи ошибок и, возможно, передавать словарь свойств для точной настройки создания JPEG.

1 голос
/ 26 февраля 2010

Извините, я действительно не знаю, почему ваш код не работает, но подходит к нему по-другому (и я думаю, более эффективно, чем ваш CVImageBuffer для CIImage к NSCIImageRep для NSImage к NSData, хотя и немного ниже уровень): -

  1. CVImageBuffer для CGImage
  2. CGImage для файла jpg

У меня нет готового кода, чтобы сделать это, но извлечь нужные вещи из этих примеров должно быть просто.

...