在控制台中收到消息:"CreateWrappedSurface() failed for a dataprovider-backed CGImageRef."

7

升级到Xcode 7后,在操作期间渲染图像时出现以下警告信息:

CreateWrappedSurface()无法为dataprovider-backed CGImageRef创建表面。

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 如果使用CGImageRef初始化UIImage对象,则属性的值为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");

问题是,我在控制台仍然收到警告信息
有人遇到过这个消息吗?如何消除这个警告信息?
谢谢, Adam

当我开始在后台线程中运行我的CIFilters时(因为它们非常慢,而且还在自动释放池中),我开始遇到这个(iOS9)问题。似乎没有引起任何负面影响,只是出现了这个提示信息,但我仍在进行研究以寻找答案。 - Albert Renshaw
我似乎只在模拟器上遇到了这个问题,而在设备上没有。嗯。 - Albert Renshaw
只需将您的图像从RGB转换为RGBA。 - Albert Renshaw
1个回答

8
最终找到了答案。由于错误引起的好奇心,我研究了一下CIImage的工作原理(请参考https://uncorkedstudios.com/blog/image-filters-with-core-graphics)。
我注意到CGImageRef是使用预乘值(RGB和A)支持的dataprovider。我想到我正在加载到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现在具有正确的dataprovider支持,错误消失了。
注意:
我正在使用CIClamp滤镜进行高斯模糊,如果opaque设置为NO,则夹紧效果不太好。我决定保持opaque为YES并忽略日志警告,它们似乎实际上没有做任何事情。

谢谢你的建议!这是避免警告/错误信息的唯一方法吗?我的意思是,我正在使用CIContext和CIFilter进行操作,在这种情况下引入CGContext感觉有点过度了。 - Adam Szabo
@AdamSzabo 你仍然可以做到这一切,只需确保你的CGContext不是不透明的,而是具有alpha通道。 - Albert Renshaw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接