7

更新到 Xcode 7并在操作中渲染图像时收到此(警告?)消息:

数据提供者支持的 CGImageRef 的 CreateWrappedSurface() 失败。

Xcode 6.4 下没有这样的消息。

得到了哪个代码部分抛出了消息:

if (!self.originalImage) // @property (nonatomic, strong) UIImage *originalImage;
        return;

CGImageRef originalCGImage = self.originalImage.CGImage;
NSAssert(originalCGImage, @"Cannot get CGImage from original image");
CIImage *inputCoreImage = [CIImage imageWithCGImage:originalCGImage]; // this results the console message

我替换了我的 CIIImage 创建者以直接从 UIImage 获取它:

CIImage *originalCIImage = self.originalImage.CIImage;
NSAssert(originalCIImage, @"Cannot build CIImage from original image");

在这种情况下,我没有收到任何控制台消息,但有一个断言: originalCIImage 为 nil。

UIImage 的类参考说:

@property(nonatomic, readonly) CIImage *CIImage

如果 UIImage 对象是使用 CGImageRef 初始化的,则该属性的值为 nil。

所以我使用原始代码作为后备:

CIImage *originalCIImage = self.originalImage.CIImage;
if (!originalCIImage) {
    CGImageRef originalCGImageRef = self.originalImage.CGImage;
    NSAssert(originalCGImageRef, @"Unable to get CGimageRef of originalImage");
    originalCIImage = [CIImage imageWithCGImage:originalCGImageRef];
}
NSAssert(originalCIImage, @"Cannot build CIImage from original image");

问题是,我仍然在控制台中收到警告消息。

以前有人收到过这个消息吗?消除该警告(?)消息的解决方案是什么?

谢谢, 亚当

4

1 回答 1

8

终于想通了答案。我对 CIImage 如何工作的错误感到好奇(https://uncorkedstudios.com/blog/image-filters-with-core-graphics

我注意到 CGImageRef 是数据提供者支持的预乘值(RGB 和 A)

我心想,我正在加载到 CIImage 中的 CGImage([CIImage imageWithCGImage:originalCGImage];仅使用 RGB 而不是 RGBA)。果然,我通过使用标准拍摄视图的快照来创建此图像,UIGraphicsBeginImageContextWithOptions并且我将 opaque 参数设置为“YES”。

我只是改变了:

UIGraphicsBeginImageContextWithOptions(bounds, YES, 1.0f);

UIGraphicsBeginImageContextWithOptions(bounds, NO, 1.0f);

所以我现在创建的是 RGBA 图像,而不是 RGB 图像。

现在我将我的 CGImage 转换为 CIImage 并且 CIImage NOW 有适当的数据提供者支持并且错误消失了。


注意

我使用 CIClamp 过滤器进行高斯模糊,并且 opaque 设置为 NO,钳位不能有效地工作。我决定将不透明保持在 YES 并忽略日志警告,它们似乎实际上并没有做任何事情。)

于 2015-09-21T06:11:29.983 回答