【问题标题】:How can I save SDWebImageSwiftUI to Photos in Swift?如何在 Swift 中将 SDWebImageSwiftUI 保存到照片中?
【发布时间】:2021-07-22 21:01:52
【问题描述】:

我一直在寻找如何将 SwiftUI SDWebImage 保存到照片的几个小时

ForEach(self.moodboardImages, id: \.self) { imageName in
                    WebImage(url: URL(string: imageName.fileLink))
                        .resizable()
                        .aspectRatio(contentMode: .fit)
                        .pinchToZoom()
                        .onTapGesture {
                            //Save to Library ?
                        }
                }

我有一个包含照片 URL 的对象数组,我通过 imageName.fileLink 在 forEach 循环中访问它。

现在我尝试允许在用户点击图像时保存到照片。 似乎在 SwiftUI 中找不到任何东西,所有教程都使用 UIKit,并且还找到了 UIKit 的 SDWebImage 而不是 SwiftUI。

这里有什么可能的帮助吗?或者至少我该如何解决这个问题????

【问题讨论】:

  • 这个问题与 SwiftUI 无关——SwiftUI 只是一个用于在屏幕上呈现视图层次结构的框架。它看起来不像 WebImage 公开了一种直接从中获取 UIImage 的方法,因此您需要从 URL 下载文件,从数据中创建一个 UIImage,然后使用UIImageWriteToSavedPhotosAlbum

标签: swift swiftui sdwebimage


【解决方案1】:

希望这将帮助其他人实现与我类似的目标,因为我在sdwebimage 上看不到很多答案,我不得不花时间自己写一个答案。所以最后经过几个小时的搜索和测试不同的方法,简而言之,您将 url 图像转换为 UIImage 并将其保存到设备。

我能够通过以下代码实现我的目标:

首先我创建了一个图像保护类:

import Foundation
import SwiftUI

extension UIImage {
    var jpeg: Data? { jpegData(compressionQuality: 1) }  // QUALITY min = 0 / max = 1
    var png: Data? { pngData() }
}

extension Data {
    var uiImage: UIImage? { UIImage(data: self) }
}

class ImageSaver: NSObject {
    func writeToPhotoAlbum(image: UIImage) {
        UIImageWriteToSavedPhotosAlbum(image, self, #selector(saveError), nil)
    }

    @objc func saveError(_ image: UIImage, didFinishSavingWithError error: Error?, contextInfo: UnsafeRawPointer) {
        print("save finished")
    }
}

这是基于此回购:https://github.com/krish-21/Fiftygram

然后在我的ContentView.swift中添加这两个变量和函数

@State var imageData: UIImage?
@State private var imageSaved: Bool = false

    // save Image to Photo Album
    func saveImage() {
        let imageSaver = ImageSaver()
        if let uiImage = imageData {
            imageSaver.writeToPhotoAlbum(image: uiImage)
            imageSaved = true
        }
    }

然后在保存按钮或点击手势中调用它:

imageData = UIImage(data: try! Data(contentsOf: URL(string: imageName.fileLink)!))!

saveImage()

所以我的代码看起来是这样的,因为项目隐私,无法发布完整代码:

import Foundation
import SwiftUI
import SDWebImageSwiftUI

struct ContentView: View {
    @State var imageData: UIImage?
    @State private var imageSaved: Bool = false

    // save Image to Photo Album
    func saveImage() {
        let imageSaver = ImageSaver()
        if let uiImage = imageData {
            imageSaver.writeToPhotoAlbum(image: uiImage)
            imageSaved = true
        }
    }

    var body: some View {
        VStack {
            ForEach(self.moodboardImages, id: \.self) { imageName in
                WebImage(url: URL(string: imageName.fileLink))
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .pinchToZoom()
                    .onTapGesture {
                        //Save to Library ?
                        imageData = UIImage(data: try! Data(contentsOf: URL(string: moodboardImages[index].fileLink)!))!
                        saveImage()
                    }
            }
        }
        // alert the user after image is saved
        .alert(isPresented: $imageSaved) {
            Alert(title: Text("Saved"), message: Text("Moodboard image has been saved to Photos"), dismissButton: .default(Text("Done")))
        }
    }
}

在对sdwebimage GitHub 问题选项卡和版本拉取请求进行了一些挖掘之后,我能够找到这个:

您可以通过使用以下参数添加.onSuccess,从WebImage 中获取原始图像和数据对象。

WebImage(url: URL(string: imageName.fileLink))
                    .resizable()
                    .aspectRatio(contentMode: .fit)
                    .pinchToZoom()
                    .onSuccess {
                        (image, data, cacheType) in
                        // you can use image or data to save it, or do whatever you want with it, example:
                        // saveImage(data) or saveImage(image) , depending on your needs or code
                    }

Note 适用于SDWebImageSwiftUI 2.0+

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多