在控制台中获取消息:对于支持数据提供者的CGImageRef,“CreateWrappedSurface()失败。”

时间:2015-09-17 13:52:45

标签: objective-c xcode uiimage cgimageref ciimage

更新为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是零。

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");

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

以前有人收到此消息吗?什么是解决警告(?)消息的解决方案?

谢谢, 亚当

1 个答案:

答案 0 :(得分:8)

终于找到了答案。好奇的是我研究了CIImage的工作原理(https://uncorkedstudios.com/blog/image-filters-with-core-graphics

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

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

我只是改变了:

UIGraphicsBeginImageContextWithOptions(bounds, YES, 1.0f);

UIGraphicsBeginImageContextWithOptions(bounds, NO, 1.0f);

因此,我现在正在创建RGBA图像,而不是RGB图像。

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

注意

我正在使用CIClamp滤镜进行高斯模糊处理,并且将opaque设置为NO时,限幅器无效。我决定将不透明保持为YES并忽略日志警告,它们实际上似乎没有做任何事情。)