Ошибка сохранения NSImage как NSData
-
22-09-2019 - |
Вопрос
Я использую следующий код для сохранения кадра фильма на свой рабочий стол:
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, хотя и на немного более низком уровне):-
У меня нет готового кода для этого, но извлечение нужного материала из этих примеров должно быть простым делом.