我正在使用一些CoreImage过滤器来处理图像。将滤镜应用于输入图像会生成名为filterOutputImage的输出图像,类型为CIImage。
我现在希望显示该图像,并试着这样做:
self.modifiedPhoto = [UIImage imageWithCIImage:filterOutputImage];
self.photoImageView.image = self.modifiedPhoto;
但视图为空白 - 没有显示任何内容。
如果我添加了打印出有关filterOutputImage和self.modifiedPhoto详细信息的日志记录语句,那些日志记录语句会向我显示这些变量似乎包含合法的图像数据:报告它们的大小并且对象不是nil。 / p>
所以在做了一些谷歌搜索后,我找到了一个需要通过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方法做错了什么导致图像看起来存在但无法显示?是否总是需要“通过”CGImage阶段才能从CIImage生成UIImage?
希望有人能解决我的困惑:)
小时。
答案 0 :(得分:16)
应该这样做!
-(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;
}
答案 1 :(得分:8)
我假设self.photoImageView
是UIImageView? 如果是这样,最终,它将在UIImage上调用 -[UIImage CGImage]
,然后将该CGImage作为CALayer的contents
属性传递。
(见评论:我的细节错了)
根据-[UIImage CGImage]
的UIImage文档:
If the UIImage object was initialized using a CIImage object, the
value of the property is NULL.
因此UIImageView调用-CGImage,但结果为NULL,因此不会显示任何内容。
我没试过这个,但你可以尝试制作一个自定义的UIView,然后在 -draw...
中使用UIImage的-[UIView drawRect:]
方法来绘制CIImage。