2010-02-26 78 views
0

我使用下面的代码到电影的图像保存到我的桌面:错误节省NSImage中作为NSData的

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

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

回答

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

+0

谢谢Jess。你的解决方案效果很好。臂,感谢您的帖子。 虽然我们在这里,有没有人知道在将图像保存到磁盘之前是否有水平翻转图像的方法? 再次感谢。 瑞奇。 – Ricky 2010-02-27 00:42:49

1

对不起,我真的不知道为什么你的代码不工作,但接近它不同的方式(我认为更有效地比你的CVImageBuffer到CIImage到NSCIImageRep到NSImage到NSData,虽然略微较低的水平): -

  1. CVImageBuffer to CGImage
  2. CGImage to jpg file

我没有代码现成的做到这一点,但是从这些例子中提取正确的东西应该是直线前进。