2010-02-26 60 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

我沒有代碼現成的做到這一點,但是從這些例子中提取正確的東西應該是直線前進。