Browse Source

猫变人开发完毕

100Years 3 weeks ago
parent
commit
fd1fdb63cc

+ 8 - 1
AIEmoji/Business/Data/TSDBHistoryManager.swift

@@ -25,6 +25,8 @@ enum TSDBHistoryType: String,CaseIterable {
     case photoExpand = "kTSAIPhotoExpandHistoryListString"   //照片扩展
     case photoQuality = "kTSAIPhotoQualityHistoryListString"   //照片变高清
     case motherDay = "kTSAIMotherDayHistoryListString"   //母亲节
+    case catTohuman = "kTSAICatTohumanHistoryListString"   //猫变人
+    
 }
 
 
@@ -287,9 +289,14 @@ extension TSRealmManager {
         return getDBHistory(type: TSDBHistoryType.photoQuality)
     }
     
-    //变高清图
+    //母亲节
     var motherDayDBHistory:TSDBHistory {
         return getDBHistory(type: TSDBHistoryType.motherDay)
     }
+    
+    //猫变人
+    var catTohumanDBHistory:TSDBHistory {
+        return getDBHistory(type: TSDBHistoryType.catTohuman)
+    }
 }
 

+ 31 - 1
AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstCell.swift

@@ -36,12 +36,13 @@ class TSAILIstCell: TSBaseCollectionCell {
 //                }else{
 //                    animatedImageView.isHidden = true
 //                    shadowImageView.isHidden = true
-                    bgImageView.image = UIImage(named: itemModel.leftImageName ?? "")
+                    bgImageView.image = UIImage(named: imageNamed)
 //                }
 
             }
             titleLab.text = itemModel.leftTitle
             infoLab.text = itemModel.leftSubTitle
+            catPawAnimatedImageView.isHidden = !itemModel.isWhether
         }
     }
     
@@ -51,6 +52,23 @@ class TSAILIstCell: TSBaseCollectionCell {
         return bgImageView
     }()
     
+    
+    lazy var catPawAnimatedImageView: AnimatedImageView = {
+        let animatedImageView = AnimatedImageView()
+        animatedImageView.autoPlayAnimatedImage = false
+        if let gifURL = Bundle.main.url(forResource: "catPaw_right", withExtension: "gif") {
+            animatedImageView.kf.setImage(with: gifURL, options: [.cacheOriginalImage]) { result in
+                switch result {
+                case .success(let value):
+                    print("GIF 加载成功: \(value.source.url?.absoluteString ?? "")")
+                case .failure(let error):
+                    print("GIF 加载失败: \(error.localizedDescription)")
+                }
+            }
+        }
+        return animatedImageView
+    }()
+    
 //    lazy var animatedImageView: AnimatedImageView = {
 //        let animatedImageView = AnimatedImageView()
 //        animatedImageView.autoPlayAnimatedImage = false
@@ -107,6 +125,18 @@ class TSAILIstCell: TSBaseCollectionCell {
             make.leading.equalTo(12)
             make.bottom.equalTo(infoLab.snp.top).offset(0)
         }
+        
+        bgContentView.addSubview(catPawAnimatedImageView)
+        catPawAnimatedImageView.snp.makeConstraints { make in
+            make.leading.equalTo(12)
+            make.bottom.equalTo(titleLab.snp.top).offset(-4)
+            make.width.equalTo(13.0)
+            make.height.equalTo(22.0)
+        }
+        
+        kDelayMainShort {
+            self.catPawAnimatedImageView.startAnimating()
+        }
     }
     
 }

+ 13 - 11
AIEmoji/Business/TSAILIstVC/TSAILIstVC/TSAILIstVC.swift

@@ -30,24 +30,26 @@ class TSAILIstVC: TSBaseVC {
                         kPushVC(target: self, modelVC: baseVc)
 //                    }
         }))
+        
         //猫咪变人
-        sectionModel.addSubItemModel(
-            createItemModel(
-                leftImageName:"aiList_catTohuman",
-                leftTitle: "Pet Humanization".localized,
-                leftSubTitle: "Curious about what your pet is like?".localized,
-                rightViewStyle: 0,
-                tapBlock: { [weak self] model, _, _ in
-                   guard let self = self else { return }
+        let catTohumanItemModel = createItemModel(
+            leftImageName:"aiList_catTohuman",
+            leftTitle: "Pet Humanization".localized,
+            leftSubTitle: "Curious about what your pet is like?".localized,
+            rightViewStyle: 0,
+            tapBlock: { [weak self] model, _, _ in
+               guard let self = self else { return }
 //                    enterSelectPhotos(
 //                        userDefaultsKey: "",
 //                        maxBitSize: kUploadImageMaxBit10Size,
 //                         config:.getDefaultConfig(imageMaxBitSize: kUploadImageMaxBit10Size)
 //                    ) { image in
-                    let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: nil,imageMaxBitSize: kUploadImageMaxBit10Size, generatorStyle: .photoQuality)
-                        kPushVC(target: self, modelVC: baseVc)
+                let baseVc = TSAIUploadPhotoBaseVC(titleString: model.leftTitle ?? "",upLoadImage: nil,imageMaxBitSize: kUploadImageMaxBit10Size, generatorStyle: .catTohuman)
+                    kPushVC(target: self, modelVC: baseVc)
 //                    }
-        }))
+            })
+        catTohumanItemModel.isWhether = true
+        sectionModel.addSubItemModel(catTohumanItemModel)
         
         //改发型
         sectionModel.addSubItemModel(

+ 2 - 0
AIEmoji/Business/TSAILIstVC/TSAIListHistoryBaseVC/TSAIListHistoryBaseVC.swift

@@ -145,6 +145,8 @@ extension TSAIListHistoryBaseVC{
             TSRMShared.photoQualityDBHistory
         case .motherDay:
             TSRMShared.motherDayDBHistory
+        case .catTohuman:
+            TSRMShared.catTohumanDBHistory
         }
     }
     

+ 4 - 1
AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIListPhotoGeneratorBaseVC.swift

@@ -10,15 +10,18 @@ struct TSAIListPhotoGeneratorModel {
     var generatorStyle:TSGeneratorImageStyle
     var expandEdge:UIEdgeInsets
     var expandViewSizes:(CGSize,CGSize)?
+    var additionalPrompt:String//追加的提示词
     init(upLoadImage: UIImage,
          generatorStyle: TSGeneratorImageStyle,
          expandEdge:UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0),
-         expandViewSizes:(CGSize,CGSize)? = nil
+         expandViewSizes:(CGSize,CGSize)? = nil,
+         additionalPrompt:String = ""
     ) {
         self.upLoadImage = upLoadImage
         self.generatorStyle = generatorStyle
         self.expandEdge = expandEdge
         self.expandViewSizes = expandViewSizes
+        self.additionalPrompt = additionalPrompt
     }
 }
 

+ 11 - 2
AIEmoji/Business/TSAILIstVC/TSAIPhotoGeneratorBaseVC/TSAIPhotoGeneratorBaseVM/TSAIListPhotoGeneratorBaseVM.swift

@@ -159,9 +159,16 @@ class TSAIListPhotoGeneratorBaseVM {
                             "device":getUserInfoJsonString()]
             case .motherDay:
                 urlType = .imageRewrite
-                postDict = ["prompt":"把照片转化为Q版人物形象,3D黏土风,是真实世界的光影,保留原始人物细节,包括服装和造型。整体放在一张拍立得照片中,有一只手握着拍立得相纸。图中角色从拍立得相纸中,突破边框,延伸进入现实世界的二维空间。背景要温馨,包含母亲节快乐的元素。",
+                postDict = ["prompt":"把照片转化为Q版人物形象,3D黏土风,是真实世界的光影,保留原始人物数量和细节,包括服装和造型。整体放在一张拍立得照片中,有一只手握着拍立得相纸。图中角色从拍立得相纸中,突破边框,延伸进入现实世界的二维空间。背景要温馨,包含母亲节快乐的元素。处理掉异常现象如半个物体",
                             "imageUrl":imageUrl,
-                            "device":getUserInfoJsonString()]
+                            "device":getUserInfoJsonString(),
+                            "advance": true]
+            case .catTohuman:
+                urlType = .imageRewrite
+            postDict = ["prompt":"Turn my pets into a human" + generatorModel.additionalPrompt,
+                            "imageUrl":imageUrl,
+                            "device":getUserInfoJsonString(),
+                            "advance": true]
         }
         creatRequest = TSNetworkShared.post(urlType: urlType,parameters: postDict) { [weak self] data,error in
             guard let self = self else { return }
@@ -283,6 +290,8 @@ class TSAIListPhotoGeneratorBaseVM {
             return 10*1024
         case .motherDay:
             return 10*1024
+        case .catTohuman:
+            return 10*1024
         }
     }
     

+ 53 - 8
AIEmoji/Business/TSAILIstVC/TSAIUploadPhotoBaseVC/TSAIUploadPhotoBaseVC.swift

@@ -6,6 +6,7 @@
 //
 
 import PhotosUI
+import BetterSegmentedControl
 enum TSGeneratorImageStyle {
     case ageOld      //变老
     case ageChild   //变年轻
@@ -16,6 +17,7 @@ enum TSGeneratorImageStyle {
     case photoExpand     //照片扩展
     case photoQuality    //照片变高清
     case motherDay    //母亲节
+    case catTohuman    //猫变人
 }
 
 class TSAIUploadPhotoBaseVC: TSBaseVC {
@@ -140,7 +142,37 @@ class TSAIUploadPhotoBaseVC: TSBaseVC {
         deleteBtn.isHidden = true
         return deleteBtn
     }()
-    
+
+    lazy var segmentedView: BetterSegmentedControl = {
+        let segmentedView = BetterSegmentedControl(
+            frame: .zero,
+            segments:
+                LabelSegment.segments(
+                    withTitles: ["Femenino".localized,"Masculino".localized,"Aleatorio".localized],
+                    normalFont: .font(size: 12.0),
+                    normalTextColor: .white.withAlphaComponent(0.4),
+                    selectedFont: .font(size: 12.0),
+                    selectedTextColor: "#111111".uiColor),
+            options:[.backgroundColor(.white.withAlphaComponent(0.1)),
+                     .indicatorViewBackgroundColor(.white),
+                     .indicatorViewInset(2),
+                     .cornerRadius(20.0),
+                     .animationSpringDamping(1.0)]
+        )
+        segmentedView.addTarget(self,action: #selector(segmentedControlValueChanged(_:)),for: .valueChanged)
+        return segmentedView
+    }()
+    var additionalPrompt = "male"
+    @objc func segmentedControlValueChanged(_ sender: BetterSegmentedControl) {
+        switch sender.index {
+        case 0:
+            additionalPrompt = "male"
+        case 1:
+            additionalPrompt = "female"
+        default:
+            additionalPrompt = ""
+        }
+    }
     
     override func createView() {
         
@@ -199,11 +231,20 @@ extension TSAIUploadPhotoBaseVC {
             make.width.height.equalTo(32)
         }
         
-        
-        //文字信息区域
-        cusStackView.addSubviewToStack(getTextInfoCell(text: "Single photo with face fully visible".localized))
-        cusStackView.addSpacing(length: lineSpacing)
-        cusStackView.addSubviewToStack(getTextInfoCell(text: "No group photos, covered faces, nudes".localized))
+        if generatorStyle == .catTohuman {
+            cusStackView.addSubviewToStackWhiteBoard(segmentedView, length: 46)
+            segmentedView.snp.makeConstraints { make in
+                make.width.equalTo(k_ScreenWidth-70)
+                make.height.equalTo(40)
+                make.center.equalToSuperview()
+            }
+        }else{
+            //文字信息区域
+            cusStackView.addSubviewToStack(getTextInfoCell(text: "Single photo with face fully visible".localized))
+            cusStackView.addSpacing(length: lineSpacing)
+            cusStackView.addSubviewToStack(getTextInfoCell(text: "No group photos, covered faces, nudes".localized))
+        }
+
     }
     
     func getTextInfoCell(text:String) -> UIView {
@@ -268,9 +309,11 @@ extension TSAIUploadPhotoBaseVC {
     
     func generateImage() {
         if kJudgeVip(externalBool: true, vc: self){ return } //判断 vip
-        
         guard let upLoadImage = upLoadImage else { return }
-        let gennerateVC = TSAIListPhotoGeneratorBaseVC(generatorModel: TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle)){ [weak self] model in
+        if generatorStyle != .catTohuman {
+            additionalPrompt = ""
+        }
+        let gennerateVC = TSAIListPhotoGeneratorBaseVC(generatorModel: TSAIListPhotoGeneratorModel(upLoadImage: upLoadImage, generatorStyle: generatorStyle,additionalPrompt: additionalPrompt)){ [weak self] model in
             guard let self = self else { return }
             saveModel(model: model)
         }
@@ -298,6 +341,8 @@ extension TSAIUploadPhotoBaseVC {
             TSRMShared.photoQualityDBHistory.updateData(model)
         case .motherDay:
             TSRMShared.motherDayDBHistory.updateData(model)
+        case .catTohuman:
+            TSRMShared.catTohumanDBHistory.updateData(model)
         }
     }
 

+ 1 - 0
Podfile

@@ -24,6 +24,7 @@ target 'AIEmoji' do
 #  pod "MarkdownKit"
   pod "MXParallaxHeader"
   pod "DynamicBlurView"
+  pod 'BetterSegmentedControl', '~> 2.0'
 end
 
 

+ 5 - 1
Podfile.lock

@@ -1,5 +1,6 @@
 PODS:
   - Alamofire (5.10.2)
+  - BetterSegmentedControl (2.0.1)
   - DynamicBlurView (5.0.3)
   - IQKeyboardCore (1.0.5)
   - IQKeyboardManagerSwift (8.0.0):
@@ -71,6 +72,7 @@ PODS:
 
 DEPENDENCIES:
   - Alamofire
+  - BetterSegmentedControl (~> 2.0)
   - DynamicBlurView
   - IQKeyboardManagerSwift
   - JXPagingView
@@ -88,6 +90,7 @@ DEPENDENCIES:
 SPEC REPOS:
   trunk:
     - Alamofire
+    - BetterSegmentedControl
     - DynamicBlurView
     - IQKeyboardCore
     - IQKeyboardManagerSwift
@@ -116,6 +119,7 @@ EXTERNAL SOURCES:
 
 SPEC CHECKSUMS:
   Alamofire: 7193b3b92c74a07f85569e1a6c4f4237291e7496
+  BetterSegmentedControl: 09607b27861d49cbce48b7673b74f9150a3d371a
   DynamicBlurView: b57e2f6aa33f85b2bcca272265162a3c7c5cc499
   IQKeyboardCore: 28c8bf3bcd8ba5aa1570b318cbc4da94b861711e
   IQKeyboardManagerSwift: 0c6fbbaa2e60739e48d7cf59f25661471a7a3a65
@@ -139,6 +143,6 @@ SPEC CHECKSUMS:
   SwipeCellKit: 3972254a826da74609926daf59b08d6c72e619ea
   TSSmalCoacopods: 6aa97167f0c76b16fc7d1fd1eb198bb6aece4f68
 
-PODFILE CHECKSUM: 2b99c499d2d0b8510ec7508631defa3f2e7debab
+PODFILE CHECKSUM: a1a02c32185bf3b726475c8530459c49d84a6c45
 
 COCOAPODS: 1.16.2