Ios5 从CIImage创建UIImage

Ios5 从CIImage创建UIImage,ios5,uiimage,core-image,Ios5,Uiimage,Core Image,我正在使用一些CoreImage过滤器来处理图像。将过滤器应用于我的输入图像会产生一个名为filterOutputImage的输出图像,类型为CIImage 我现在希望显示该图像,并尝试执行以下操作: self.modifiedPhoto = [UIImage imageWithCIImage:filterOutputImage]; self.photoImageView.image = self.modifiedPhoto; 但是,视图为空-未显示任何内容 如果我添加了打印有关filterO

我正在使用一些CoreImage过滤器来处理图像。将过滤器应用于我的输入图像会产生一个名为filterOutputImage的输出图像,类型为CIImage

我现在希望显示该图像,并尝试执行以下操作:

self.modifiedPhoto = [UIImage imageWithCIImage:filterOutputImage];
self.photoImageView.image = self.modifiedPhoto;
但是,视图为空-未显示任何内容

如果我添加了打印有关filterOutputImage和self.modifiedPhoto的详细信息的日志语句,那么这些日志语句将向我显示这两个变量似乎都包含合法的图像数据:它们的大小正在报告,对象不是零

所以在谷歌搜索之后,我找到了一个需要经过CGImage阶段的解决方案;可视信息:

CGImageRef outputImageRef = [context createCGImage:filterOutputImage fromRect:[filterOutputImage extent]];
self.modifiedPhoto = [UIImage imageWithCGImage:outputImageRef scale:self.originalPhoto.scale orientation:self.originalPhoto.imageOrientation];
self.photoImageView.image = self.modifiedPhoto;
CGImageRelease(outputImageRef);
第二种方法有效:我在视图中显示正确的图像

有人能解释一下我第一次尝试失败的原因吗?使用imageWithCIImage方法生成的图像看似存在但无法显示,我做错了什么?为了从CIImage生成UIImage,是否总是需要“通过”CGImage阶段

希望有人能澄清我的困惑:)


H.

我假设
self.photoImageView
是UIImageView?如果是这样,它最终将在UIImage上调用
-[UIImage CGImage]
,然后将该CGImage作为CALayer的
内容
属性传递

(见备注:我的详细信息错了)

根据
-[UIImage CGImage]
的UIImage文档:

If the UIImage object was initialized using a CIImage object, the
value of the property is NULL.
因此UIImageView调用-CGImage,但结果为NULL,因此不显示任何内容

我还没有尝试过这个,但是您可以尝试创建一个自定义UIView,然后使用UIImage的
-[UIView drawRect:]
中的
-draw…
方法来绘制CIImage。

应该可以

-(UIImage*)makeUIImageFromCIImage:(CIImage*)ciImage
{
    self.cicontext = [CIContext contextWithOptions:nil];
    // finally!
    UIImage * returnImage;

    CGImageRef processedCGImage = [self.cicontext createCGImage:ciImage 
                                                       fromRect:[ciImage extent]];

    returnImage = [UIImage imageWithCGImage:processedCGImage];
    CGImageRelease(processedCGImage);

    return returnImage;
}

啊!非常感谢。是的,photoImageView是UIImageView。我不知道它使用了UIImage的CGImage属性。还有一个问题,它在哪个文档中解释了UIImageView如何显示其图像?我试图找出你从哪里学到的:)事实上,现在我实际上看到了二进制代码:UIImageView overrides-drawRect:而不是在它自己的CALayer上调用setContents:。看起来它最终调用了UIImage draw方法,这些方法获取CGImageRef并绘制它。所以,结果是一样的,但我的细节是错误的。class-dump也有帮助。-[UIImageView drawRect:]的出现对我来说是一个巨大的暗示,我最初关于内容的陈述是错误的