Procházet zdrojové kódy

1.修复 ai 扩图的计算问题
2.增加ai扩图结果的对比功能

100Years před 20 hodinami
rodič
revize
eb7e65ecf5

+ 15 - 3
AIEmoji.xcodeproj/project.pbxproj

@@ -90,11 +90,12 @@
 		A80EDE022D6F1CCD003CD332 /* TSPTPGeneratorVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80EDE012D6F1CCB003CD332 /* TSPTPGeneratorVC.swift */; };
 		A80EDE062D6F3491003CD332 /* TSPTPBrowseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A80EDE052D6F3490003CD332 /* TSPTPBrowseVC.swift */; };
 		A80EDE082D700395003CD332 /* rotatingAnimation.gif in Resources */ = {isa = PBXBuildFile; fileRef = A80EDE072D700395003CD332 /* rotatingAnimation.gif */; };
-		A82D60812DB7A1E600596190 /* activePhoto.gif in Resources */ = {isa = PBXBuildFile; fileRef = A82D60802DB7A1E600596190 /* activePhoto.gif */; };
 		A82D60792DB7703D00596190 /* TSAIExpandImageVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A82D60782DB7703C00596190 /* TSAIExpandImageVC.swift */; };
 		A82D607B2DB7724700596190 /* TSAIExpandStyleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A82D607A2DB7724600596190 /* TSAIExpandStyleView.swift */; };
 		A82D607D2DB7748800596190 /* ai_expand_image_style.json in Resources */ = {isa = PBXBuildFile; fileRef = A82D607C2DB7748200596190 /* ai_expand_image_style.json */; };
 		A82D607F2DB7772200596190 /* TSAIExpandImageVM.swift in Sources */ = {isa = PBXBuildFile; fileRef = A82D607E2DB7771B00596190 /* TSAIExpandImageVM.swift */; };
+		A82D60812DB7A1E600596190 /* activePhoto.gif in Resources */ = {isa = PBXBuildFile; fileRef = A82D60802DB7A1E600596190 /* activePhoto.gif */; };
+		A82D60832DB87D1A00596190 /* TSAIExpandChangeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A82D60822DB87D1900596190 /* TSAIExpandChangeView.swift */; };
 		A83404C82D9BEC0E00C140E4 /* UIFont+TSEx.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83404C72D9BEC0700C140E4 /* UIFont+TSEx.swift */; };
 		A83404CC2D9BEED800C140E4 /* Poppins-BlackItalic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = A83404CB2D9BEED800C140E4 /* Poppins-BlackItalic.ttf */; };
 		A83404D12D9D16FA00C140E4 /* TSAIPhotoGeneratorBaseVC.swift in Sources */ = {isa = PBXBuildFile; fileRef = A83404D02D9D16F800C140E4 /* TSAIPhotoGeneratorBaseVC.swift */; };
@@ -328,11 +329,12 @@
 		A80EDE012D6F1CCB003CD332 /* TSPTPGeneratorVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPTPGeneratorVC.swift; sourceTree = "<group>"; };
 		A80EDE052D6F3490003CD332 /* TSPTPBrowseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSPTPBrowseVC.swift; sourceTree = "<group>"; };
 		A80EDE072D700395003CD332 /* rotatingAnimation.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = rotatingAnimation.gif; sourceTree = "<group>"; };
-		A82D60802DB7A1E600596190 /* activePhoto.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = activePhoto.gif; sourceTree = "<group>"; };
 		A82D60782DB7703C00596190 /* TSAIExpandImageVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIExpandImageVC.swift; sourceTree = "<group>"; };
 		A82D607A2DB7724600596190 /* TSAIExpandStyleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIExpandStyleView.swift; sourceTree = "<group>"; };
 		A82D607C2DB7748200596190 /* ai_expand_image_style.json */ = {isa = PBXFileReference; lastKnownFileType = text.json; path = ai_expand_image_style.json; sourceTree = "<group>"; };
 		A82D607E2DB7771B00596190 /* TSAIExpandImageVM.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIExpandImageVM.swift; sourceTree = "<group>"; };
+		A82D60802DB7A1E600596190 /* activePhoto.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = activePhoto.gif; sourceTree = "<group>"; };
+		A82D60822DB87D1900596190 /* TSAIExpandChangeView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIExpandChangeView.swift; sourceTree = "<group>"; };
 		A83404C72D9BEC0700C140E4 /* UIFont+TSEx.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+TSEx.swift"; sourceTree = "<group>"; };
 		A83404CB2D9BEED800C140E4 /* Poppins-BlackItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "Poppins-BlackItalic.ttf"; sourceTree = "<group>"; };
 		A83404D02D9D16F800C140E4 /* TSAIPhotoGeneratorBaseVC.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TSAIPhotoGeneratorBaseVC.swift; sourceTree = "<group>"; };
@@ -1092,13 +1094,22 @@
 		A82D60772DB7703000596190 /* TSAIExpandImageVC */ = {
 			isa = PBXGroup;
 			children = (
+				A82D60842DB87D1E00596190 /* View */,
 				A82D607E2DB7771B00596190 /* TSAIExpandImageVM.swift */,
-				A82D607A2DB7724600596190 /* TSAIExpandStyleView.swift */,
 				A82D60782DB7703C00596190 /* TSAIExpandImageVC.swift */,
 			);
 			path = TSAIExpandImageVC;
 			sourceTree = "<group>";
 		};
+		A82D60842DB87D1E00596190 /* View */ = {
+			isa = PBXGroup;
+			children = (
+				A82D60822DB87D1900596190 /* TSAIExpandChangeView.swift */,
+				A82D607A2DB7724600596190 /* TSAIExpandStyleView.swift */,
+			);
+			path = View;
+			sourceTree = "<group>";
+		};
 		A83404C62D9BEC0300C140E4 /* Ex */ = {
 			isa = PBXGroup;
 			children = (
@@ -2097,6 +2108,7 @@
 				A80EDD512D6C3F82003CD332 /* MarkdownCode.swift in Sources */,
 				A875870F2D81689A00286A66 /* TSPTPEnterView.swift in Sources */,
 				A80EDD522D6C3F82003CD332 /* MarkdownCode+AppKit.swift in Sources */,
+				A82D60832DB87D1A00596190 /* TSAIExpandChangeView.swift in Sources */,
 				A80EDD532D6C3F82003CD332 /* MarkdownHeader.swift in Sources */,
 				A80EDD542D6C3F82003CD332 /* MarkdownQuote.swift in Sources */,
 				A80EDD552D6C3F82003CD332 /* UIFont+Traits.swift in Sources */,

+ 21 - 64
AIEmoji/Business/TSAILIstVC/TSAIExpandImageVC/TSAIExpandImageVC.swift

@@ -11,7 +11,7 @@ class TSAIExpandImageVC: TSBaseVC {
     
     var upLoadImage:UIImage?{
         didSet{
-            topImageView.image = upLoadImage
+            expandAreaView.setImage(showImage: upLoadImage)
         }
     }
     
@@ -41,54 +41,11 @@ class TSAIExpandImageVC: TSBaseVC {
         return photoPickerManager
     }()
 
-    
     //###################################### topImageView ######################################
-    lazy var topAreaView: UIView = {
-        let view = UIView()
-
-        view.addSubview(expandAreaView)
-        expandAreaView.snp.makeConstraints { make in
-            make.center.equalToSuperview()
-            make.width.equalTo(maxSize.width)
-            make.height.equalTo(maxSize.height)
-        }
-
+    lazy var expandAreaView: TSAIExpandChangeView = {
+        let view = TSAIExpandChangeView()
         return view
     }()
-    
-    lazy var expandAreaView: UIView = {
-        let view = UIView()
-        
-        let imageView = UIImageView.createImageView(imageName: "clear_Bg",contentMode: .scaleAspectFill)
-        view.addSubview(imageView)
-        imageView.snp.makeConstraints { make in
-            make.edges.equalToSuperview()
-        }
-        
-        view.addSubview(topImageView)
-        topImageView.snp.makeConstraints { make in
-            make.center.equalToSuperview()
-            make.width.equalTo(maxSize.width)
-            make.height.equalTo(maxSize.height)
-        }
-        
-        let boardView = UIView()
-        boardView.layer.borderColor = UIColor.white.cgColor
-        boardView.layer.borderWidth = 1.5
-        view.addSubview(boardView)
-        boardView.snp.makeConstraints { make in
-            make.edges.equalToSuperview()
-        }
-        
-        return view
-    }()
-    
-    lazy var topImageView: UIImageView = {
-        let imageView = UIImageView()
-        imageView.isUserInteractionEnabled = true
-        imageView.contentMode = .scaleAspectFit
-        return imageView
-    }()
     //###################################### style类型 ######################################
     lazy var styleView: TSAIExpandStyleView = {
         let styleView = TSAIExpandStyleView()
@@ -118,7 +75,7 @@ class TSAIExpandImageVC: TSBaseVC {
         
         contentView.addSubview(submitBtn)
         contentView.addSubview(styleView)
-        contentView.addSubview(topAreaView)
+        contentView.addSubview(expandAreaView)
 
 
         submitBtn.snp.makeConstraints { make in
@@ -134,7 +91,7 @@ class TSAIExpandImageVC: TSBaseVC {
             make.height.equalTo(52)
         }
         
-        topAreaView.snp.makeConstraints { make in
+        expandAreaView.snp.makeConstraints { make in
             make.top.leading.trailing.equalTo(0)
             make.bottom.equalTo(styleView.snp.top).offset(0)
         }
@@ -213,8 +170,6 @@ extension TSAIExpandImageVC {
         // 确保扩图区域不超过最大限制(100%)
         let maxExpandWidth = view.bounds.width
         let maxExpandHeight = view.bounds.height
-        print("expandWidth=\(expandWidth)")
-        print("expandHeight=\(expandHeight)")
         print("\n")
         expandWidth = min(expandWidth, maxExpandWidth)
         expandHeight = min(expandHeight, maxExpandHeight)
@@ -224,11 +179,7 @@ extension TSAIExpandImageVC {
         print("\n")
         
         // 使用 SnapKit 更新约束
-        expandAreaView.snp.updateConstraints { make in
-            make.width.equalTo(expandWidth)
-            make.height.equalTo(expandHeight)
-        }
-        
+        expandAreaView.updateExpandAreaView(width: expandWidth, height: expandHeight)
         let imageRatio = min(expandWidth/imageSize.width,expandHeight/imageSize.height)
         var scaleFactor = 1.0
         if targetAspectRatio == 1.0,imageAspectRatio == 1.0 {
@@ -237,13 +188,14 @@ extension TSAIExpandImageVC {
         
         let imageViewW = imageSize.width * imageRatio * scaleFactor
         let imageViewH = imageSize.height * imageRatio * scaleFactor
-        topImageView.snp.updateConstraints { make in
-            make.width.equalTo(imageViewW)
-            make.height.equalTo(imageViewH)
-        }
         
-        let ws = 1.0 - imageViewW/expandWidth
-        let hs = 1.0 - imageViewH/expandHeight
+        print("expandWidth=\(imageViewW)")
+        print("expandHeight=\(imageViewH)")
+        
+        expandAreaView.updateImageView(width: imageViewW, height: imageViewH)
+        
+        let ws = expandWidth/imageViewW - 1.0
+        let hs = expandHeight/imageViewH - 1.0
         
         if targetAspectRatio == 1.0,imageAspectRatio == 1.0 {
             photoExpand = UIEdgeInsets(top: 0.25, left: 0.25, bottom: 0.25, right: 0.25)
@@ -252,11 +204,10 @@ extension TSAIExpandImageVC {
         }
         
         print("ws=\(ws),hs=\(hs)")
-        print("1-ws=\(1.0-ws),1-hs=\(1.0-hs)")
         print("postEdge=\(photoExpand)")
         
         UIView.animate(withDuration: 0.3) {
-            self.topAreaView.layoutIfNeeded()
+            self.expandAreaView.layoutIfNeeded()
         }
     }
 }
@@ -267,7 +218,13 @@ extension TSAIExpandImageVC {
         if kJudgeVip(externalBool: true, vc: self){ return } //判断 vip
         
         guard let upLoadImage = upLoadImage else { return }
-        let gennerateVC = TSAIListPhotoGeneratorBaseVC(generatorModel: TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: .photoExpand,expandEdge: photoExpand)) { [weak self] model in
+        let model = TSAIListPhotoGeneratorModel(
+            upLoadImage: upLoadImage,
+            generatorStyle: .photoExpand,
+            expandEdge: photoExpand,
+            expandViewSizes: (expandAreaView.bgImageView.size,expandAreaView.showImageView.size)
+        )
+        let gennerateVC = TSAIListPhotoGeneratorBaseVC(generatorModel: model) { [weak self] model in
             guard let self = self else { return }
             saveModel(model: model)
         }

+ 97 - 0
AIEmoji/Business/TSAILIstVC/TSAIExpandImageVC/View/TSAIExpandChangeView.swift

@@ -0,0 +1,97 @@
+//
+//  TSAIExpandChangeView.swift
+//  AIEmoji
+//
+//  Created by 100Years on 2025/4/22.
+//
+
+class TSAIExpandChangeView: TSBaseView {
+    
+    lazy var maxSize: CGSize = {
+        let maxSize = CGSizeMake(k_ScreenWidth, k_ScreenWidth)
+        return maxSize
+    }()
+    
+    
+    lazy var bgImageView: UIImageView = {
+        let imageView = UIImageView.createImageView(imageName: "clear_Bg",contentMode: .scaleAspectFill)
+        return imageView
+    }()
+    
+    lazy var boardView: UIView = {
+        let boardView = UIView()
+        boardView.layer.borderColor = UIColor.white.cgColor
+        boardView.layer.borderWidth = 1.5
+        return boardView
+    }()
+    
+    lazy var expandAreaView: UIView = {
+        let view = UIView()
+        
+        view.addSubview(bgImageView)
+        bgImageView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        view.addSubview(showImageView)
+        showImageView.snp.makeConstraints { make in
+            make.center.equalToSuperview()
+            make.width.equalTo(maxSize.width)
+            make.height.equalTo(maxSize.height)
+        }
+        
+        view.addSubview(boardView)
+        boardView.snp.makeConstraints { make in
+            make.edges.equalToSuperview()
+        }
+        
+        return view
+    }()
+    
+    lazy var showImageView: UIImageView = {
+        let imageView = UIImageView()
+        imageView.isUserInteractionEnabled = true
+        imageView.contentMode = .scaleAspectFit
+        return imageView
+    }()
+    
+    override func creatUI() {
+        contentView.addSubview(expandAreaView)
+        expandAreaView.snp.makeConstraints { make in
+            make.center.equalToSuperview()
+            make.width.equalTo(maxSize.width)
+            make.height.equalTo(maxSize.height)
+        }
+        
+    }
+    
+    
+    func updateExpandAreaView(width:CGFloat,height:CGFloat){
+        expandAreaView.snp.updateConstraints { make in
+            make.width.equalTo(width)
+            make.height.equalTo(height)
+        }
+    }
+    
+    func updateImageView(width:CGFloat,height:CGFloat){
+        showImageView.snp.updateConstraints { make in
+            make.width.equalTo(width)
+            make.height.equalTo(height)
+        }
+    }
+    
+    func setImage(showImage:UIImage?,bgImage:UIImage? = nil){
+        showImageView.image = showImage
+        bgImageView.image = bgImage ?? UIImage(named: "clear_Bg")
+    }
+    
+    func onlyBgImage(only:Bool) {
+        if only {
+            bgImageView.isHidden = false
+            showImageView.isHidden = true
+        }else{
+            bgImageView.isHidden = true
+            showImageView.isHidden = false
+        }
+    }
+}

+ 0 - 0
AIEmoji/Business/TSAILIstVC/TSAIExpandImageVC/TSAIExpandStyleView.swift → AIEmoji/Business/TSAILIstVC/TSAIExpandImageVC/View/TSAIExpandStyleView.swift


+ 69 - 14
AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIListPhotoGeneratorBaseVC.swift

@@ -9,10 +9,16 @@ struct TSAIListPhotoGeneratorModel {
     var upLoadImage:UIImage
     var generatorStyle:TSGeneratorImageStyle
     var expandEdge:UIEdgeInsets
-    init(upLoadImage: UIImage, generatorStyle: TSGeneratorImageStyle,expandEdge:UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)) {
+    var expandViewSizes:(CGSize,CGSize)?
+    init(upLoadImage: UIImage,
+         generatorStyle: TSGeneratorImageStyle,
+         expandEdge:UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0),
+         expandViewSizes:(CGSize,CGSize)? = nil
+    ) {
         self.upLoadImage = upLoadImage
         self.generatorStyle = generatorStyle
         self.expandEdge = expandEdge
+        self.expandViewSizes = expandViewSizes
     }
 }
 
@@ -48,6 +54,11 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
         return generateInView
     }()
     
+    lazy var expandAreaView: TSAIExpandChangeView = {
+        let view = TSAIExpandChangeView()
+        return view
+    }()
+    
     lazy var switchOriginalPictureBtn: TSUIExpandedTouchButton = {
         let switchOriginalPictureBtn = TSUIExpandedTouchButton()
         switchOriginalPictureBtn.setUpButton(image:UIImage(named: "switch_original_picture"))
@@ -75,6 +86,26 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
         }
         
         bigSaveBtn.setTitleImageSpace(spacing: 0)
+        
+        if viewModel.generatorModel.generatorStyle == .photoExpand {
+            setUpExpandAreaView()
+        }
+
+    }
+    
+    func setUpExpandAreaView(){
+        netWorkImageView.addSubview(expandAreaView)
+        expandAreaView.snp.makeConstraints { make in
+            make.top.leading.trailing.bottom.equalTo(0)
+        }
+        
+        expandAreaView.showImageView.isHidden = true
+        expandAreaView.boardView.isHidden = true
+        
+        if let sizes = self.viewModel.generatorModel.expandViewSizes {
+            expandAreaView.updateExpandAreaView(width: sizes.0.width, height: sizes.0.height)
+            expandAreaView.updateImageView(width: sizes.1.width, height: sizes.1.height)
+        }
     }
     
     override func closePage() {
@@ -148,8 +179,8 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
     
     //保存功能
     @objc override func clickSaveBtn(){
-    
-        if viewModel.generatorModel.generatorStyle == .photoLive,let imageModel = imageModel {
+        guard let imageModel = imageModel else { return }
+        if viewModel.generatorModel.generatorStyle == .photoLive{
             TSDownloadManager.getDownLoadVideo(urlString: imageModel.response.resultUrl) { url, success in
                 if let url = url {
                     PhotoManagerShared.saveVideoToAlbum(videoURL: url) { [weak self] success, error in
@@ -164,14 +195,16 @@ class TSAIListPhotoGeneratorBaseVC: TSAIPhotoGeneratorBaseVC {
                 }
             }
         }else{
-            if let image = getSuccessImage() {
-                PhotoManagerShared.saveImageToAlbum(image) { [weak self] success, error in
-                    guard let self = self else { return }
-                    if success {
-                        isSavePhotoMark = true
-                        kSavePhotoSuccesswShared.show(atView:self.view)
-                    }else{
-                        debugPrint(error)
+            UIImageView.downloadImageWithProgress(urlString: imageModel.response.resultUrl) { image in
+                if let image = image {
+                    PhotoManagerShared.saveImageToAlbum(image) { [weak self] success, error in
+                        guard let self = self else { return }
+                        if success {
+                            isSavePhotoMark = true
+                            kSavePhotoSuccesswShared.show(atView:self.view)
+                        }else{
+                            debugPrint(error)
+                        }
                     }
                 }
             }
@@ -275,17 +308,29 @@ extension TSAIListPhotoGeneratorBaseVC {
         }
         
         setVideoURL()
+        setExpandAreaImage()
     }
     
     @objc func switchOriginalPictureTouchDown() {
-        self.netWorkImageView.image = self.viewModel.generatorModel.upLoadImage
+        if viewModel.generatorModel.generatorStyle == .photoExpand {
+            expandAreaView.onlyBgImage(only: false)
+        }else{
+            self.netWorkImageView.image = self.viewModel.generatorModel.upLoadImage
+        }
     }
     
     @objc func switchOriginalPictureTouchUp() {
         guard let imageModel = imageModel else { return }
-        self.netWorkImageView.setAsyncImage(urlString: imageModel.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
+        
+        if viewModel.generatorModel.generatorStyle == .photoExpand {
+            expandAreaView.onlyBgImage(only: true)
+        }else{
+            self.netWorkImageView.setAsyncImage(urlString: imageModel.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
+        }
     }
-    
+}
+
+extension TSAIListPhotoGeneratorBaseVC {
     func setVideoHidden(){
         if viewModel.generatorModel.generatorStyle == .photoLive {
             videoPlayerVC.removeFromParent()
@@ -306,3 +351,13 @@ extension TSAIListPhotoGeneratorBaseVC {
         }
     }
 }
+extension TSAIListPhotoGeneratorBaseVC {
+    
+    func setExpandAreaImage(){
+        if viewModel.generatorModel.generatorStyle == .photoExpand {
+            netWorkImageView.image = nil
+            expandAreaView.bgImageView.setAsyncImage(urlString: imageModel?.response.resultUrl,placeholder:kPlaceholderImage,backgroundColor:netWorkImageView.backgroundColor!)
+            expandAreaView.showImageView.image = self.viewModel.generatorModel.upLoadImage
+        }
+    }
+}

+ 1 - 1
AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVM/TSAIListPhotoGeneratorBaseVM.swift

@@ -141,7 +141,7 @@ class TSAIListPhotoGeneratorBaseVM {
             case .photoExpand:
                 urlType = .photoExpand
                 postDict = ["imageUrl":imageUrl,
-                            "prompt":"根据图片内容智能扩图",
+                            "prompt":"高清智能扩图上传的照片,无缝衔接,自然延伸,风格一致,内容协调,细节丰富,过渡平滑,色彩统一,符合原图,合理补全",
                             "device":getUserInfoJsonString(),
                             "top":generatorModel.expandEdge.top,
                             "left":generatorModel.expandEdge.left,