UIImage 到 CIImage 到 UIImage 导致 pngData 在 iOS 12 上返回 nil
UIImage to CIImage to UIImage results in pngData returning nil on iOS 12
我有一个从相机拍摄的 UIImage。
我想做一些图像处理,所以我将它转换为 CIImage。
CIImage *ciImage = [CIImage imageWithCGImage:snappedImage.CGImage];
接下来我做我的事,然后将其转换回 UIImage:
UIImage *image = [UIImage imageWithCIImage:ciImage];
如果现在我想将其转换为数据以将其保存到核心数据中,例如:
NSData *data = UIImagePNGRepresentation(image);
iOS 12 上的数据最终为零。(适用于 iOS 13,如果我尝试使用 UIImageJPEGRepresentation,也会发生同样的事情)
知道为什么以及如何解决这个问题吗?
我发现在使用 [UIImage imageWithCIImage:]
API 时出现了很多问题。您会看到,当您调用此方法时,您的 CIImage
实际上并未 呈现 。结果 UIImage
仍然只是关于如何创建结果的 "recipe"。 UIImage
的用户知道这一点并在需要时触发渲染。 UIImageView
s 似乎知道这一点,但我看到其他 APIs 有很多不一致之处。
您可以改为使用 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 版本中一致。
我有一个从相机拍摄的 UIImage。
我想做一些图像处理,所以我将它转换为 CIImage。
CIImage *ciImage = [CIImage imageWithCGImage:snappedImage.CGImage];
接下来我做我的事,然后将其转换回 UIImage:
UIImage *image = [UIImage imageWithCIImage:ciImage];
如果现在我想将其转换为数据以将其保存到核心数据中,例如:
NSData *data = UIImagePNGRepresentation(image);
iOS 12 上的数据最终为零。(适用于 iOS 13,如果我尝试使用 UIImageJPEGRepresentation,也会发生同样的事情)
知道为什么以及如何解决这个问题吗?
我发现在使用 [UIImage imageWithCIImage:]
API 时出现了很多问题。您会看到,当您调用此方法时,您的 CIImage
实际上并未 呈现 。结果 UIImage
仍然只是关于如何创建结果的 "recipe"。 UIImage
的用户知道这一点并在需要时触发渲染。 UIImageView
s 似乎知道这一点,但我看到其他 APIs 有很多不一致之处。
您可以改为使用 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 版本中一致。