将NSImage保存为NSData时出错

时间:2010-02-26 09:54:22

标签: objective-c cocoa nsdata nsimage

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

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

我很感激任何帮助。 提前致谢, 瑞奇。

2 个答案:

答案 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,虽然略低一些电平): -

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