将CIImage实例转换为CGImage实例,然后再转换为UIImage实例的原因

3

我正在阅读一篇关于Core Image的文章,其中看到了以下几行:

if let output = filter?.valueForKey(kCIOutputImageKey) as? CIImage {
    let cgimgresult = context.createCGImage(output, fromRect: output.extent)
    let result = UIImage(CGImage: cgimgresult)
    imageView?.image = result
}

正如您所看到的,CIImage实例首先转换为CGImage实例,然后再转换为UIImage实例。经过一些研究,我发现这与图像视图边界内图像的比例有关。
我想知道,我们需要进行所有这些转换的唯一原因(为了显示目的具有正确的比例)是不是因为已经有一个以CIImage实例作为参数的UIImage初始化器?

是的,您可以显示一个初始化UIImage对象的CIImage,但您将无法获得该图像对象的数据表示(即:JPEG或PNG)。 - Leo Dabus
1个回答

0

UIImage的参考文献中写到:

一个已初始化的UIImage对象。在Objective-C中,如果ciImage参数为nil,则此方法返回nil。

就像@matt在这里所写的:

只有当UIImage已经由CIImage支持(例如,因为它是通过imageWithCIImage:生成的)时,UIImage的CIImage才不为nil。

因此,直接初始化:

UIImage(ciImage: ciImage)

可能是 nil

这就是为什么我们应该通过 CGImage 初始化 UIImage,而不是 CIImage


1
感谢您的回答。然而,第二个引用是关于UIImage实例上的属性ciImage,而不是它的初始化。在文档中,它说初始化程序可以返回nil,但这只适用于Objective-C。在Swift的声明中,init不能失败,因此它不能返回nil。据我所知,您试图表达的是将其转换为CGImage的原因是UIImage(ciImage:)的返回值可能为空。但正如我上面提到的,在Swift的情况下,这是一个错误的假设。 - Tigran Iskandaryan

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