我使用以下代码将电影的帧保存到桌面:

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 仍然是整个方法调用的分配对象,因此我不确定为什么会收到有关图像数量不足的投诉。

我将不胜感激任何帮助。预先感谢Ricky。

有帮助吗?

解决方案

我想问题的来源是您传递NSCIImageRep对象的数组到representationOfImageRepsInArray:usingType:性质:,我相信期望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创建。

其他提示

很抱歉,我真的不知道为什么你的代码不起作用,但以不同的方式处理它(我认为比你的 CVImageBuffer 到 CIImage 到 NSCIImageRep 到 NSImage 到 NSData 更有效,尽管级别稍低): -

  1. CVImageBuffer 到 CGImage
  2. CG图像转jpg文件

我没有准备好代码来执行此操作,但从这些示例中提取正确的内容应该是直接的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top