繁体   English   中英

如何将 SwiftUI 图像保存到磁盘或获取数据?

[英]How can I save a SwiftUI image to disk or get the data out?

我正在尝试将 SwiftUI 图像(不是来自 UIKit 的 UIImage)保存到磁盘。

我到处找,但找不到任何有关如何执行此操作的文档信息。 我也看不到从 SwiftUI 图像中提取数据的方法。

有人可以帮忙吗? 提前致谢。

使用 SwiftUI,事情会有所不同。 你想做的事,不能那样做。 相反,您需要查看图像是如何创建的,并从您的Image()最初获得它的同一个地方获取图像数据。

此外,如果您需要实际的二进制数据将其保存到磁盘,则需要一个UIImage (请注意,我不是说UIImageView )。

幸运的是,Image 也可以处理UIImage ,检查另一个问题: https : //stackoverflow.com/a/57028615/7786555

我将 SwiftUI 图像转换为 UIImage,然后将其保存到 UserDefaults。

这不是最好的解决方案,但我没有找到更好的解决方案:

   // reading the saved image from userDefaults
   private func getSavedImage(for size: String) -> Image? {
    if let data = UserDefaults.standard.data(forKey: size) {
        if let image = UIImage(data: data) {
            return Image(uiImage: image)
        }
    }
    return nil
  }



// Converting SwiftUI Image to UIImage
extension View {

    public func toUIImage() -> UIImage {

        let controller = UIHostingController(rootView: self)
        controller.view.frame = CGRect(x: 0, y: CGFloat(Int.max), width: 1, height: 1)
        #if targetEnvironment(macCatalyst)

            UIApplication.shared.windows.first!.rootViewController?.view.addSubview(controller.view)

        #else

        var window: UIWindow? {
            guard let scene = UIApplication.shared.connectedScenes.first,
                  let windowSceneDelegate = scene.delegate as? UIWindowSceneDelegate,
                  let window = windowSceneDelegate.window else {
                return nil
            }
            return window
        }

        if let window = window, let rootViewController = window.rootViewController {
                var topController = rootViewController
                while let newTopController = topController.presentedViewController {
                    topController = newTopController
                }
            topController.view.insertSubview(controller.view, at: controller.view.subviews.count)
        } else {
            print("cant access window")
        }

        #endif

        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.toUIImage()
        controller.view.removeFromSuperview()
        return image
    }
}

使用顶级助手并保存图像:

extension Image {
    
func toData()-> Data {
    return self.toUIImage().jpegData(compressionQuality: 1)!
}

func save(for name: String) {
        UserDefaults.standard.setValue(self.toData(), forKey: name)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM