我使用以下代码将电影的帧保存到我的桌面:
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仍然是整个方法调用的分配对象,所以我不确定为什么我收到有关图像数量不足的投诉。
我很感激任何帮助。 提前致谢, 瑞奇。
答案 0 :(得分:3)
我认为问题的根源是你将一个NSCIImageRep对象数组传递给representationOfImageRepsInArray:usingType:properties:,我相信它需要一个NSBitmapImageRep对象数组。
您要做的是从CIImage创建NSBitmapImageRep。然后你可以用它来写入磁盘。那将是粗略的:
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 :(得分:1)
对不起,我真的不知道为什么你的代码不起作用,但以不同的方式接近它(我认为比你的CVImageBuffer更有效率到CIImage到NSCIImageRep到NSImage到NSData,虽然略低一些电平): -
我没有准备好执行此操作的代码,但从这些示例中提取正确的内容应该是直截了当的。