如何将 SDWebImageSwiftUI 保存到 Swift 中的照片?
How can I save SDWebImageSwiftUI to Photos in Swift?
我已经搜索了几个小时如何将 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,并且还找到了 SDWebImage for UIKit 而不是 SwiftUI。
这里有什么可能的帮助吗?或者至少我该如何解决这个问题
希望这会帮助其他人实现与我相似的目标,因为我在 sdwebimage
上看不到很多答案,所以我不得不花时间自己写一个答案。因此,经过数小时的搜索和测试不同的方法后,简而言之,您将 url 图像转换为 UIImage 并将其保存到设备。
我能够通过以下代码实现我的目标:
首先我创建了一个图像保护程序class:
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")
}
}
那是基于这个 repo: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()
所以我的代码是这样的,由于项目隐私,不能post完整代码:
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
}
注意适用于 SDWebImageSwiftUI 2.0+
我已经搜索了几个小时如何将 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,并且还找到了 SDWebImage for UIKit 而不是 SwiftUI。
这里有什么可能的帮助吗?或者至少我该如何解决这个问题
希望这会帮助其他人实现与我相似的目标,因为我在 sdwebimage
上看不到很多答案,所以我不得不花时间自己写一个答案。因此,经过数小时的搜索和测试不同的方法后,简而言之,您将 url 图像转换为 UIImage 并将其保存到设备。
我能够通过以下代码实现我的目标:
首先我创建了一个图像保护程序class:
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")
}
}
那是基于这个 repo: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()
所以我的代码是这样的,由于项目隐私,不能post完整代码:
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
}
注意适用于 SDWebImageSwiftUI 2.0+