如何在Swift中从CGImage创建UIImage?

24

我正在尝试使用ALAssetsGroup#posterImage方法创建UIImage。 在Objective-C中,我可以简单地调用[UIImage imageWithCGImage:group.posterImage],但在Swift中,UIImage(CGImage:group.posterImage)会给我一个编译器错误:

Could not find an overload for 'init' that accepts the supplied arguments

我做错了什么?


这里真正的问题是“找不到重载”的信息并不是很有用。我建议你就此提出改进请求。Swift在其错误信息方面可以做得更好。 - matt
@Fattie 请注意日期:这个问题是关于 Swift 的原始版本,而不是当前版本。并且没有崩溃 - 这是一个编译器错误。 - Bill
4个回答

32
如果您查看Xcode6文档,您会发现posterImage()返回一个Unmanaged<CGImage>!(在Swift中,ObjC返回CGImageRef)。从文档中进行了一些调查后,我发现以下内容: > 当您从未注释的API接收到未管理的对象时,应立即将其转换为内存管理对象,然后再进行操作。
因此,您的解决方案应该是:
UIImage(CGImage: group.posterImage().takeUnretainedValue())

1
那并没有帮助,但是我从那段代码中得到的错误信息有用: “没有() -> Unmanaged<CGImage>!的方法”。 所以posterImage是一个func而不是一个属性。 在posterImage后添加圆括号就解决了问题。 - Bill

12

2023语法更新:

someImage = UIImage(cgImage: someCGImage)

一个典型的例子是从CALayer中获取图像:

someImage = UIImage(cgImage: donorLayer.contents as! CGImage)

你确定 group.posterImage 不是可选的吗?

你试过了吗?

var img = UIImage(CGImage: group.posterImage!) // 2010s syntax

1
是的,我确定。上面的代码给出了相同的编译器错误。 - Bill
这是正常的方法,完美地运作。 - Fattie

3

这里是一个使用Xcode 8.3的适用于你的示例:

    let frame = CGRect(origin: CGPoint(x: 0, y: 0), size: CGSize(width: 1920, height: 1080))
    let cgImage = CIContext().createCGImage(CIImage(color: .black()), from: frame)!
    let uiImage = UIImage(cgImage: cgImage)

2
使用CGIImage初始化init:
UIImage.init(CGImage: group.posterImage, scale: self.scale, orientation: .UpMirrored)

如果我需要增加图像的比例,该如何实现? - niks290192
只需使用CGFloat值设置所需的比例。 - Pichirichi

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