将 NSImage 保存为 NSData 时出错
-
22-09-2019 - |
题
我使用以下代码将电影的帧保存到桌面:
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 更有效,尽管级别稍低): -
我没有准备好代码来执行此操作,但从这些示例中提取正确的内容应该是直接的。
不隶属于 StackOverflow