我有一个从相机拍摄的UIImage。我想进行一些图像操作,因此将其转换为CIImage。CIImage *ciImage = [CIImage imageWithCGImage:snappedImage.CGImage];
接下来,我做我的事情,然后将其转换回UIImage:UIImage *image = [UIImage imageWithCIImage:ciImage];
如果现在我想将其转换为数据以将其保存到Core Data中,例如:NSData *data = UIImagePNGRepresentation(image);
数据最终在iOS 12上为零。(在iOS 13上有效,如果我尝试使用UIImageJPEGRepresentation,也会发生同样的事情)
任何想法为什么以及如何解决此问题?
我看到使用[UIImage imageWithCIImage:]
API时出现了许多问题。您会看到,调用此方法时,CIImage
实际上不是rendered。结果UIImage
仍然只是如何创建结果的“配方”。 UIImage
的用户要知道并在需要时触发渲染。 UIImageView
似乎知道这一点,但是我发现其他API之间存在很多不一致之处。
您可以做的是使用CIContext
并自己进行显式渲染:
// ideally you create this context once and re-use it because it's an expensive object
CIContext* context = [CIContext context];
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceSRGB);
NSData* data = [context PNGRepresentationOfImage:ciImage format:kCIFormatBGRA8 colorSpace:colorSpace options:nil];
CGColorSpaceRelease(colorSpace);
这应该在任何iOS版本中均能正常工作。