|
@@ -30,9 +30,9 @@ class TSAIListPhotoGeneratorBaseVM {
|
|
|
var stopNetwork = false
|
|
|
|
|
|
@Published var stateDatauPblished:(TSProgressState,TSActionInfoModel?) = (TSProgressState.none,nil)
|
|
|
- var generatingProgress = 0
|
|
|
|
|
|
var imageUrl:String?
|
|
|
+ var imageUrls:[String]?
|
|
|
var generatorModel:TSAIListPhotoGeneratorModel
|
|
|
init(generatorModel:TSAIListPhotoGeneratorModel) {
|
|
|
self.generatorModel = generatorModel
|
|
@@ -68,7 +68,12 @@ class TSAIListPhotoGeneratorBaseVM {
|
|
|
// }
|
|
|
|
|
|
func uploadAndCreatImage() {
|
|
|
-
|
|
|
+ //上传多个图片
|
|
|
+ if let _ = generatorModel.upLoadImages {
|
|
|
+ uploadImagesAndCreat()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ //上传单个图片
|
|
|
if let imageUrl = imageUrl,imageUrl.contains("http") {
|
|
|
creatImage()
|
|
|
return
|
|
@@ -80,9 +85,9 @@ class TSAIListPhotoGeneratorBaseVM {
|
|
|
stateDatauPblished = (.progressString(uploadingPhoto(progress: 0.0)),nil)
|
|
|
uploadRequest = TSNetworkShared.uploadImage(upLoadImage: generatorModel.upLoadImage, maxKb: generatorModel.generatorStyle.imageMaxKb) { [weak self] progress in
|
|
|
guard let self = self else { return }
|
|
|
- if generatingProgress == 0 {
|
|
|
- stateDatauPblished = (.progressString(uploadingPhoto(progress: progress)),nil)
|
|
|
- }
|
|
|
+
|
|
|
+ stateDatauPblished = (.progressString(uploadingPhoto(progress: progress)),nil)
|
|
|
+
|
|
|
} completion: { [weak self] data, error in
|
|
|
guard let self = self else { return }
|
|
|
if let error = error {
|
|
@@ -97,79 +102,106 @@ class TSAIListPhotoGeneratorBaseVM {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private func uploadImagesAndCreat() {
|
|
|
+
|
|
|
+ if let imageUrls = imageUrls{
|
|
|
+ creatImage()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ guard let upLoadImages = generatorModel.upLoadImages else { return }
|
|
|
+ var uploadImageUrls:[String] = []
|
|
|
+ let progressRatio:Float = 1.0/Float(upLoadImages.count)//进度分割比例
|
|
|
+ var totalProgress:Float = 0.0//总进度
|
|
|
+ stopNetwork = false
|
|
|
+ stateDatauPblished = (.start,nil)
|
|
|
+ stateDatauPblished = (.progressString(uploadingPhoto(progress: 0.0)),nil)
|
|
|
+
|
|
|
+ let group = DispatchGroup()
|
|
|
+ for image in upLoadImages {
|
|
|
+ group.enter()
|
|
|
+ uploadRequest = TSNetworkShared.uploadImage(upLoadImage: image, maxKb: generatorModel.generatorStyle.imageMaxKb) { [weak self] progress in
|
|
|
+ guard let self = self else { return }
|
|
|
+ totalProgress+=progress*progressRatio
|
|
|
+ stateDatauPblished = (.progressString(uploadingPhoto(progress: totalProgress)),nil)
|
|
|
+ } completion: { [weak self] data, error in
|
|
|
+ guard let self = self else { return }
|
|
|
+ if let error = error {
|
|
|
+ self.imageUrls = nil
|
|
|
+ self.stateDatauPblished = (TSProgressState.getFailed(error.tsDesc,error.tsCode),nil)
|
|
|
+ }else{
|
|
|
+ if let string = data as? String {
|
|
|
+ uploadImageUrls.append(string)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ group.leave()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ group.notify(queue: .main) {
|
|
|
+ if uploadImageUrls.count == upLoadImages.count {
|
|
|
+ self.imageUrls = uploadImageUrls
|
|
|
+ self.imageUrl = ""
|
|
|
+ self.creatImage()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
func creatImage() {
|
|
|
guard let imageUrl = imageUrl else { return }
|
|
|
- generatingProgress = 0
|
|
|
stopNetwork = false
|
|
|
stateDatauPblished = (.start,nil)
|
|
|
stateDatauPblished = (.progressString(generating(progress: 0.0)),nil)
|
|
|
|
|
|
var urlType:TSNeURLType = .changeAge
|
|
|
- var postDict:[String:Any] = [:]
|
|
|
+ var postDict:[String:Any] = [
|
|
|
+ "device":getUserInfoJsonString(),
|
|
|
+ "imageUrl":imageUrl
|
|
|
+ ]
|
|
|
switch generatorModel.generatorStyle {
|
|
|
- case .ageOld:
|
|
|
- postDict = ["targetAge":70,
|
|
|
- "imageUrl":imageUrl,
|
|
|
- "device":getUserInfoJsonString()
|
|
|
- ]
|
|
|
- case .ageChild:
|
|
|
- postDict = ["targetAge":5,
|
|
|
- "imageUrl":imageUrl,
|
|
|
- "device":getUserInfoJsonString()
|
|
|
- ]
|
|
|
- case .oldPhoto:
|
|
|
- urlType = .imageRestore
|
|
|
- postDict = ["imageUrl":imageUrl,
|
|
|
- "device":getUserInfoJsonString()
|
|
|
- ]
|
|
|
- case .eyeOpen:
|
|
|
- urlType = .eyeOpen
|
|
|
- postDict = ["imageUrl":imageUrl,
|
|
|
- "device":getUserInfoJsonString()
|
|
|
- ]
|
|
|
- case .pretty:
|
|
|
- urlType = .pretty
|
|
|
- postDict = ["imageUrl":imageUrl,
|
|
|
- "level":1.0,
|
|
|
- "device":getUserInfoJsonString()
|
|
|
+ case .ageOld:
|
|
|
+ postDict = ["targetAge":70
|
|
|
+ ]
|
|
|
+ case .ageChild:
|
|
|
+ postDict = ["targetAge":5
|
|
|
+ ]
|
|
|
+ case .oldPhoto:
|
|
|
+ urlType = .imageRestore
|
|
|
+ case .eyeOpen:
|
|
|
+ urlType = .eyeOpen
|
|
|
+ case .pretty:
|
|
|
+ urlType = .pretty
|
|
|
+ postDict = ["level":1.0]
|
|
|
+ case .photoLive:
|
|
|
+ urlType = .photoAnimation
|
|
|
+ case .photoExpand:
|
|
|
+ urlType = .photoExpand
|
|
|
+ postDict = ["prompt":"高清智能扩图上传的照片,无缝衔接,自然延伸,风格一致,内容协调,细节丰富,过渡平滑,色彩统一,符合原图,合理补全",
|
|
|
+ "top":generatorModel.expandEdge.top,
|
|
|
+ "left":generatorModel.expandEdge.left,
|
|
|
+ "bottom":generatorModel.expandEdge.bottom,
|
|
|
+ "right":generatorModel.expandEdge.right
|
|
|
]
|
|
|
- case .photoLive:
|
|
|
- urlType = .photoAnimation
|
|
|
- postDict = ["imageUrl":imageUrl,
|
|
|
- "device":getUserInfoJsonString()
|
|
|
- ]
|
|
|
- case .photoExpand:
|
|
|
- urlType = .photoExpand
|
|
|
- postDict = ["imageUrl":imageUrl,
|
|
|
- "prompt":"高清智能扩图上传的照片,无缝衔接,自然延伸,风格一致,内容协调,细节丰富,过渡平滑,色彩统一,符合原图,合理补全",
|
|
|
- "device":getUserInfoJsonString(),
|
|
|
- "top":generatorModel.expandEdge.top,
|
|
|
- "left":generatorModel.expandEdge.left,
|
|
|
- "bottom":generatorModel.expandEdge.bottom,
|
|
|
- "right":generatorModel.expandEdge.right
|
|
|
- ]
|
|
|
- case .photoQuality:
|
|
|
-// urlType = .overResolution
|
|
|
-// postDict = ["imageUrl":imageUrl,
|
|
|
-// "device":getUserInfoJsonString()
|
|
|
-// ]
|
|
|
- urlType = .imageRewrite
|
|
|
- postDict = ["prompt":"提高上传图片的清晰度,不要改变任何",
|
|
|
- "imageUrl":imageUrl,
|
|
|
- "device":getUserInfoJsonString(),
|
|
|
- "advance": generatorModel.generatorStyle.advance]
|
|
|
- case .motherDay:
|
|
|
- urlType = .imageRewrite
|
|
|
- postDict = ["prompt":"把照片转化为Q版人物形象,3D黏土风,是真实世界的光影,保留原始人物数量和细节,包括服装和造型。整体放在一张拍立得照片中,有一只手握着拍立得相纸。图中角色从拍立得相纸中,突破边框,延伸进入现实世界的二维空间。背景要温馨,包含母亲节快乐的元素。处理掉异常现象如半个物体",
|
|
|
- "imageUrl":imageUrl,
|
|
|
- "device":getUserInfoJsonString(),
|
|
|
- "advance": generatorModel.generatorStyle.advance]
|
|
|
- case .catTohuman:
|
|
|
- urlType = .imageRewrite
|
|
|
- postDict = ["prompt":"Turn my pets into a human" + generatorModel.additionalPrompt,
|
|
|
- "imageUrl":imageUrl,
|
|
|
- "device":getUserInfoJsonString(),
|
|
|
- "advance": generatorModel.generatorStyle.advance]
|
|
|
+ case .photoQuality:
|
|
|
+ urlType = .imageRewrite
|
|
|
+ postDict = ["prompt":"提高上传图片的清晰度,不要改变任何",
|
|
|
+ "advance": generatorModel.generatorStyle.advance]
|
|
|
+ case .motherDay:
|
|
|
+ urlType = .imageRewrite
|
|
|
+ postDict = ["prompt":"把照片转化为Q版人物形象,3D黏土风,是真实世界的光影,保留原始人物数量和细节,包括服装和造型。整体放在一张拍立得照片中,有一只手握着拍立得相纸。图中角色从拍立得相纸中,突破边框,延伸进入现实世界的二维空间。背景要温馨,包含母亲节快乐的元素。处理掉异常现象如半个物体",
|
|
|
+ "advance": generatorModel.generatorStyle.advance]
|
|
|
+ case .catTohuman:
|
|
|
+ urlType = .imageRewrite
|
|
|
+ postDict = ["prompt":"Turn my pets into a human" + generatorModel.additionalPrompt,
|
|
|
+ "advance": generatorModel.generatorStyle.advance]
|
|
|
+ case .futureBaby:
|
|
|
+ guard let imageUrls = imageUrls else { return }
|
|
|
+ urlType = .imageRewrite
|
|
|
+ postDict = ["prompt":"AI-generated a child, blending the uploaded photo's parents' facial features, balanced genetic traits, realistic portrait, age-progression, gender-appropriate stylish clothing, playful yet natural expression, family resemblance, high-detail rendering, soft lighting." + generatorModel.additionalPrompt,
|
|
|
+ "advance": generatorModel.generatorStyle.advance,
|
|
|
+ "imageUrls":imageUrls
|
|
|
+ ]
|
|
|
+ postDict.removeValue(forKey: "imageUrl")
|
|
|
}
|
|
|
creatRequest = TSNetworkShared.post(urlType: urlType,parameters: postDict) { [weak self] data,error in
|
|
|
guard let self = self else { return }
|
|
@@ -209,27 +241,22 @@ class TSAIListPhotoGeneratorBaseVM {
|
|
|
}
|
|
|
|
|
|
self.stateDatauPblished = (.success(nil),genmojiModel)
|
|
|
- self.generatingProgress = 0
|
|
|
}else{
|
|
|
self.stateDatauPblished = (.generalNormalFailed,nil)
|
|
|
- self.generatingProgress = 0
|
|
|
}
|
|
|
}
|
|
|
}else {
|
|
|
downloadImage(urlString: genmojiModel.response.resultUrl) { [weak self] in
|
|
|
guard let self = self else { return }
|
|
|
self.stateDatauPblished = (.success(nil),genmojiModel)
|
|
|
- generatingProgress = 0
|
|
|
}
|
|
|
}
|
|
|
}else{
|
|
|
self.stateDatauPblished = (.success(nil),genmojiModel)
|
|
|
- generatingProgress = 0
|
|
|
}
|
|
|
|
|
|
case .failed:
|
|
|
self.stateDatauPblished = (TSProgressState.getFailed(genmojiModel.response.codeErrorMsg,genmojiModel.response.code),nil)
|
|
|
- generatingProgress = 0
|
|
|
default:
|
|
|
stateDatauPblished = (.progressString(generating(progress: genmojiModel.percent)),nil)
|
|
|
if stopNetwork == false {
|
|
@@ -297,7 +324,6 @@ class TSAIListPhotoGeneratorBaseVM {
|
|
|
progressInt = 99
|
|
|
}
|
|
|
|
|
|
- generatingProgress = progressInt
|
|
|
return generatingText + " \(progressInt)%"
|
|
|
}
|
|
|
|