Вопрос

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

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 по-прежнему является выделенным объектом для всего вызова метода, поэтому я не уверен, почему я получаю жалобы на недостаточное количество изображений.

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

Это было полезно?

Решение

Я думаю, что источник проблемы заключается в том, что вы передаете массив объектов NSCIImageRep в representationOfImageRepsInArray: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.

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top