【问题标题】:How do I create a UIImage from a CGImage in Swift?如何在 Swift 中从 CGImage 创建 UIImage?
【发布时间】:2014-06-20 03:45:16
【问题描述】:

我正在尝试从 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 的错误消息可以做得更好。

标签: ios swift uiimage core-foundation cgimage


【解决方案1】:

如果您查看 Xcode6 中的文档,您会看到 posterImage() 返回 Unmanaged<CGImage>!(在 Swift 中,在 ObjC 中返回 CGImageRef)。经过docs 的一些调查后,我发现了这一点:

当您收到来自未注释 API 的非托管对象时,您 应该在你之前立即将它转换为内存管理对象 使用它。

所以你的解决方案是:

UIImage(CGImage: group.posterImage().takeUnretainedValue())

【讨论】:

  • 这无济于事,但我从该代码中得到的错误消息确实:“() -> Unmanaged<CGImage>! 没有方法”。所以posterImagefunc 而不是属性。在 posterImage 之后添加括号就可以了。
【解决方案2】:

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

你试过了吗

var img = UIImage(CGImage: group.posterImage!)

【讨论】:

  • 是的,我确定。上面的代码给出了相同的编译器错误。
【解决方案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)

【讨论】:

    【解决方案4】:

    将 init 与 CGIImage 一起使用:

    UIImage.init(CGImage: group.posterImage, scale: self.scale, orientation: .UpMirrored)
    

    【讨论】:

    • 如果我必须增加图像的比例怎么可能?
    • 只需使用 CGFloat 值设置您想要的比例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多