如何将图像转换为 UIImage

Posted

技术标签:

【中文标题】如何将图像转换为 UIImage【英文标题】:How to convert a image to UIImage 【发布时间】:2019-07-14 14:54:17 【问题描述】:

因为关于 swiftUI 的文档还不是很好,所以我想问一下如何将“图像”转换为“UIImage”或如何将“图像”转换为 pngData/jpgData

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

【问题讨论】:

嗨@nOK,你为什么需要那个?以及你想达到什么目标? UIImageUIKit 的一部分,而不是SwiftUI您到底想做什么?如果没有 SwiftUI,你可以很容易地 - 通过非常有文档记录的东西 - *convertUIImage, CGImage, and CIImage. If you consider that Image` 之间非常 更像是UIImageView,再次,你到底在找什么? 我试图在 CoreData 和 UIImage 中保存图像,我可以轻松地使用 image.pngData() 但在 swiftUI 中找不到图像的可能性 “Image”类型的变量似乎也不符合“Hashable”原型 【参考方案1】:

这样的事情在 SwiftUI 中是不可能的,我敢打赌它永远不会。它违背了整个框架概念。但是,您可以这样做:

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

【讨论】:

“Image”类型的变量似乎不符合“Hashable”原型,这就是我希望能够转换它的原因:/ 如果您想从Image 视图中获取数据,您不是从Image 本身获取数据,而是从图像获取数据的同一位置获取数据。例如,如果您使用 uiImage 对象加载 Image,则应该转到该 uiImage 对象。如果视图从文件名中获取图像,则应该从文件中获取图像。您将永远无法查询 Image 的二进制文件,这不是框架的设计方式。 感谢您的帮助。我有点想避免这种情况,但认为可能会这样:D让我们重写代码然后:D @kontiki 为什么它违背了整个框架概念?【参考方案2】:

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

我们需要 2 个组件来实现这一点。第一个函数将我们的 Image/View 更改为 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: `.asUIImage()`
        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

【讨论】:

感谢您的回答 Mahdi,在某些情况下非常有趣和有用。不过,我会删除最后的 P.S 部分,这不是 Youtube 频道或 Instagram :)。 我应该如何更改 ios 15 的 UIApplication.shared.windows.first!.rootViewController?.view.addSubview(controller.view) 行?我收到弃用警告:"'windows' was deprecated in iOS 15.0: Use UIWindowScene.windows on a relevant window scene instead".

以上是关于如何将图像转换为 UIImage的主要内容,如果未能解决你的问题,请参考以下文章

如何通过覆盖现有图像将一堆图像转换为黑白图像?

如何将图像转换为PDF?

如何将图标转换为图像

如何将线性布局转换为图像

CSS:如何将彩色图像转换为灰色或黑白图像[重复]

对于IOS,如何使用vImage将ARGB图像转换为灰度图像