【问题标题】:UIImage to CIImage to UIImage results in pngData returning nil on iOS 12UIImage 到 CIImage 到 UIImage 导致 pngData 在 iOS 12 上返回 nil
【发布时间】:2020-04-06 19:20:24
【问题描述】:

我有一个从相机拍摄的 UIImage。
我想做一些图像处理,所以我将其转换为 CIImage。
CIImage *ciImage = [CIImage imageWithCGImage:snappedImage.CGImage];
接下来我做我的事情,然后将其转换回 UIImage:
UIImage *image = [UIImage imageWithCIImage:ciImage];
如果现在我想将其转换为数据以将其保存到核心数据中,例如:
NSData *data = UIImagePNGRepresentation(image);
数据最终在 iOS 12 上为零。(适用于 iOS 13,如果我尝试使用 UIImageJPEGRepresentation,也会发生同样的情况)

知道为什么以及如何解决这个问题吗?

【问题讨论】:

    标签: ios uiimage png core-image


    【解决方案1】:

    我发现在使用[UIImage imageWithCIImage:] API 时出现了很多问题。你看,当你调用这个方法时,你的CIImage 实际上并没有渲染。生成的UIImage 仍然只是如何创建结果的“秘诀”。 UIImage 的用户需要知道这一点并在需要时触发渲染。 UIImageViews 似乎知道这一点,但我发现其他 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 版本中都能正常工作。

    【讨论】:

    • 谢谢弗兰克。 pngData 文档指出:“如果图像没有 CGImageRef 或无效的位图格式,则可能返回 nil”。所以imageWithCIImage: 创建了一个有效的图像,但是图像没有关联CGImageRef,所以它不能与UIImagePNGRepresentation 一起使用?
    • 基本上,是的。 UIImage 只是 CGImageRef(RAM 中的位图数据)、图像源(例如,指向磁盘上文件的东西)或 CIImage 的包装器,而 CIImage 又是 "配方”用于创建图像(在 GPU 上)。只有当您在某处使用UIImage 时,才会创建/读取实际的位图数据。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2015-05-04
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 1970-01-01
    相关资源
    最近更新 更多