如何将图像转换为UIImage

时间:2019-07-14 14:54:17

标签: image uiimage swiftui

由于swiftUI上的文档不是很好,但我想问一下如何将“图像”转换为“ UIImage”或如何将“图像”转换为pngData / jpgData

let image = Image(systemName: "circle.fill")
let UIImage = image as UIImage

2 个答案:

答案 0 :(得分:4)

没有将Image转换为UIImage的直接方法。相反,您应该将Image视为View,然后尝试将该View转换为UIImage。 图片符合View,因此我们已经有了所需的View。现在我们只需要将该视图转换为UIImage。

我们需要2个组件来实现这一目标。首先是将图片/视图更改为UIView的功能,其次是将我们创建的UIView更改为UIImage的功能。

为了方便起见,两个函数都声明为它们适当类型的扩展。

extension View {
// This function changes our View to UIView, then calls another function
// to convert the newly-made UIView to a UIImage.
    public func asUIImage() -> UIImage {
        let controller = UIHostingController(rootView: self)
        
        controller.view.frame = CGRect(x: 0, y: CGFloat(Int.max), width: 1, height: 1)
        UIApplication.shared.windows.first!.rootViewController?.view.addSubview(controller.view)
        
        let size = controller.sizeThatFits(in: UIScreen.main.bounds.size)
        controller.view.bounds = CGRect(origin: .zero, size: size)
        controller.view.sizeToFit()
        
// here is the call to the function that converts UIView to UIImage: `.asImage()`
        let image = controller.view.asUIImage()
        controller.view.removeFromSuperview()
        return image
    }
}

extension UIView {
// This is the function to convert UIView to UIImage
    public func asUIImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

如何使用?

let image: Image = Image("MyImageName") // Create an Image anyhow you want
let uiImage: UIImage = image.asUIImage() // Works Perfectly

奖金

正如我所说,我们将图像视为视图。在此过程中,我们不使用Image的任何特定功能,唯一重要的是我们的Image是View(符合View协议)。 这意味着使用此方法,您不仅可以将Image转换为UIImage,还可以将任何View转换为UIImage。

var myView: some View {
// create the view here
}
let uiImage = myView.asUIImage() // Works Perfectly

答案 1 :(得分:1)

SwiftUI无法做到这一点,我敢打赌永远也不会。它再次说明了整个框架的概念。但是,您可以这样做:

let uiImage = UIImage(systemName: "circle.fill")
let image = Image(uiImage: uiImage)