0

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

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

我会很感激任何帮助。在此先感谢,瑞奇。

4

2 回答 2

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 创建。

于 2010-02-26T17:08:40.067 回答
1

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

  1. CVImageBuffer 到 CGImage
  2. CGImage转jpg文件

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

于 2010-02-26T15:48:50.513 回答