我要实现的是批量给图片加水印的功能。下面是我的代码,我有两个问题,不知道哪里出了问题。
任何人都可以帮助我解决这些问题,我将不胜感激。
import SwiftUI
import PhotosUI
struct BatchAddLogo: View {
@State private var selectedItems = [PhotosPickerItem]()
@State private var selectedItemIndex = 0
@State private var yourWatermark = ""
@State private var showingAlert = false
let imageSaver = ImageSaver()
var body: some View {
VStack {
TextField("Please input your watermark for you photo", text: $yourWatermark)
.textFieldStyle(.roundedBorder)
.padding()
PhotosPicker(selection: $selectedItems,maxSelectionCount: 9, matching: .images) {
Label("Select photo", systemImage: "photo")
.frame(width: 200,height: 60)
.foregroundColor(Constant().fontColor)
.background(RoundedRectangle(cornerRadius:10).fill(Constant().backgroundColor))
}
.disabled(yourWatermark.isEmpty)
.onChange(of: selectedItems) { _ in
Task {
for item in selectedItems {
if let data = try? await item.loadTransferable(type: Data.self) {
if let uiImage = UIImage(data: data) {
//add watermark
let image = Image(uiImage: uiImage)
let watermarkedImage = image.overlay(WatermarkImage(watermarkString: yourWatermark),alignment: .bottomTrailing)
//save image
let watermarkerUIImage = watermarkedImage.asUIImage()
imageSaver.writeToPhotoAlbum(image: watermarkerUIImage)
}
}
selectedItemIndex += 1
if selectedItemIndex == selectedItems.count {
showingAlert = true
}
}
}
}
}
.alert(isPresented: $showingAlert) {
Alert(title: Text("Notice"), message: Text(imageSaver.message))
}
}
}
struct WatermarkImage: View {
var watermarkString: String
var body: some View {
ZStack {
Text(watermarkString)
.font(.system(size: 120))
.foregroundColor(.white)
.padding(6)
}
.background(Color.black.opacity(0.2))
.cornerRadius(10.0)
.padding(6)
}
}
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)
let scene = UIApplication.shared.connectedScenes.first as? UIWindowScene
scene?.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)
}
}
}
对于问题#1:我预计如果我选择一张或多张照片,每张照片都会添加水印并保存回照片库。
对于问题#2:我预计如果照片保存成功,消息将是:保存成功。否则,消息将是错误的内容。