TSAIExpandImageVC.swift 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. //
  2. // TSAIExpandImageVC.swift
  3. // TSLiveWallpaper
  4. //
  5. // Created by 100Years on 2025/7/27.
  6. //
  7. class TSAIExpandImageVC: TSBaseVC {
  8. var upLoadImage:UIImage?{
  9. didSet{
  10. submitBtn.isEnabled = !(upLoadImage == nil)
  11. expandAreaView.setImage(showImage: upLoadImage)
  12. }
  13. }
  14. init(upLoadImage: UIImage?) {
  15. self.upLoadImage = upLoadImage
  16. super.init()
  17. }
  18. @MainActor required init?(coder: NSCoder) {
  19. fatalError("init(coder:) has not been implemented")
  20. }
  21. lazy var viewModel: TSAIExpandImageVM = {
  22. let viewModel:TSAIExpandImageVM = TSAIExpandImageVM()
  23. return viewModel
  24. }()
  25. var photoExpand = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
  26. lazy var photoPickerManager: TSPhotoPickerManager = {
  27. let photoPickerManager = TSPhotoPickerManager(viewController: self)
  28. return photoPickerManager
  29. }()
  30. //###################################### topImageView ######################################
  31. lazy var expandAreaView: TSAIExpandChangeView = {
  32. let view = TSAIExpandChangeView()
  33. view.clickAddViewBlock = { [weak self] in
  34. guard let self = self else { return }
  35. self.pickSinglePhoto()
  36. }
  37. return view
  38. }()
  39. //###################################### style类型 ######################################
  40. lazy var styleView: TSAIExpandStyleView = {
  41. let styleView = TSAIExpandStyleView()
  42. styleView.dataArray = viewModel.selectStyleModels
  43. styleView.currentIndexPath = IndexPath(item: viewModel.selectedStyleIndex, section: 0)
  44. styleView.selectedValueBlock = { [weak self] model in
  45. guard let self = self else { return }
  46. handelSelectedValueBlock(model: model)
  47. }
  48. return styleView
  49. }()
  50. //###################################### 提交按钮 ######################################
  51. lazy var submitBtn: UIButton = {
  52. let submitBtn = kCreateNormalSubmitBtn(title: "Expand".localized) { [weak self] in
  53. guard let self = self else { return }
  54. generateImage()
  55. }
  56. return submitBtn
  57. }()
  58. //###################################### createView ######################################
  59. override func createView() {
  60. addNormalNavBarView()
  61. setPageTitle("AI Expand Photo".localized)
  62. _ = setNavigationItem("", imageName: "replace_photo", direction: .right, action: #selector(clickNavRight))
  63. contentView.addSubview(submitBtn)
  64. contentView.addSubview(styleView)
  65. contentView.addSubview(expandAreaView)
  66. submitBtn.snp.makeConstraints { make in
  67. make.centerX.equalToSuperview()
  68. make.width.equalTo(250*kDesignScale)
  69. make.height.equalTo(48)
  70. make.bottom.equalTo(-12-k_Height_safeAreaInsetsBottom())
  71. }
  72. styleView.snp.makeConstraints { make in
  73. make.bottom.equalTo(submitBtn.snp.top).offset(-36)
  74. make.leading.trailing.equalTo(0)
  75. }
  76. expandAreaView.snp.makeConstraints { make in
  77. make.top.leading.trailing.equalTo(0)
  78. make.bottom.equalTo(styleView.snp.top).offset(-61)
  79. }
  80. let image = upLoadImage
  81. upLoadImage = image
  82. updateExpandArea()
  83. }
  84. override func dealThings() {
  85. NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
  86. updateVipView()
  87. }
  88. @objc func updateVipView() {
  89. kMainAsync{
  90. kSetBtnVipIcon(btn: self.submitBtn, show: kPurchaseBusiness.generateVipShow(type: .general))
  91. }
  92. }
  93. }
  94. extension TSAIExpandImageVC {
  95. @objc func clickNavRight() {
  96. pickSinglePhoto()
  97. }
  98. func handelSelectedValueBlock(model:TSGenerateStyleModel) {
  99. if model.clickType == 2 { //换图
  100. self.pickSinglePhoto()
  101. }else{
  102. viewModel.selectStyleModel = model
  103. styleView.agreeWillSelectIndexPath()
  104. updateExpandArea()
  105. }
  106. }
  107. func pickSinglePhoto() {
  108. pickSinglePhoto{ [weak self] image in
  109. guard let self = self else { return }
  110. upLoadImage = image
  111. viewModel.upLoadImage = image
  112. updateExpandArea()
  113. if upLoadImage == nil {
  114. pop()
  115. }
  116. }
  117. }
  118. func pickSinglePhoto(complete: @escaping (UIImage)->Void) {
  119. photoPickerManager.pickPhoto() { [weak self] images in
  120. guard let self = self else { return }
  121. if let image = images.first {
  122. complete(image)
  123. }else{
  124. dePrint("图片异常")
  125. }
  126. self.photoPickerManager.dismissPageVC()
  127. }
  128. }
  129. // MARK: - 更新扩图区域
  130. private func updateExpandArea() {
  131. var imageSize = CGSizeMake(500, 500)
  132. if let upLoadImage = upLoadImage {
  133. imageSize = upLoadImage.size
  134. }
  135. let imageAspectRatio = imageSize.width / imageSize.height
  136. let targetAspectRatio = viewModel.currentRatio.value
  137. let maxSize = expandAreaView.maxSize
  138. dePrint("imageAspectRatio=\(imageAspectRatio)")
  139. dePrint("targetAspectRatio=\(targetAspectRatio)")
  140. dePrint("\n")
  141. var expandWidth: CGFloat
  142. var expandHeight: CGFloat
  143. if targetAspectRatio >= 1.0 {
  144. // 以宽度为基准
  145. expandWidth = maxSize.width
  146. expandHeight = expandWidth / targetAspectRatio
  147. }else {
  148. // 以高度为基准
  149. expandHeight = maxSize.height
  150. expandWidth = expandHeight * targetAspectRatio
  151. }
  152. // 确保扩图区域不超过最大限制(100%)
  153. let maxExpandWidth = maxSize.width
  154. let maxExpandHeight = maxSize.height
  155. print("\n")
  156. expandWidth = min(expandWidth, maxExpandWidth)
  157. expandHeight = min(expandHeight, maxExpandHeight)
  158. print("expandWidth=\(expandWidth)")
  159. print("expandHeight=\(expandHeight)")
  160. print("\n")
  161. let difference = abs(targetAspectRatio - imageAspectRatio) <= 0.01
  162. print("targetAspectRatio=\(targetAspectRatio),imageAspectRatio=\(imageAspectRatio),difference=\(difference)")
  163. // 使用 SnapKit 更新约束
  164. expandAreaView.updateExpandAreaView(width: expandWidth, height: expandHeight)
  165. let imageRatio = min(expandWidth/imageSize.width,expandHeight/imageSize.height)
  166. var scaleFactor = 1.0
  167. if difference {
  168. scaleFactor = 0.67
  169. }
  170. let imageViewW = imageSize.width * imageRatio * scaleFactor
  171. let imageViewH = imageSize.height * imageRatio * scaleFactor
  172. dePrint("expandWidth=\(imageViewW)")
  173. dePrint("expandHeight=\(imageViewH)")
  174. expandAreaView.updateImageView(width: imageViewW, height: imageViewH)
  175. let ws = expandWidth/imageViewW - 1.0
  176. let hs = expandHeight/imageViewH - 1.0
  177. if difference {
  178. photoExpand = UIEdgeInsets(top: 0.25, left: 0.25, bottom: 0.25, right: 0.25)
  179. }else{
  180. photoExpand = UIEdgeInsets(top: hs/2.0, left: ws/2.0, bottom: hs/2.0, right: ws/2.0)
  181. }
  182. print("ws=\(ws),hs=\(hs)")
  183. print("postEdge=\(photoExpand)")
  184. UIView.animate(withDuration: 0.3) {
  185. self.expandAreaView.layoutIfNeeded()
  186. }
  187. }
  188. }
  189. extension TSAIExpandImageVC {
  190. func generateImage() {
  191. if kPurchaseBusiness.kJudgeVipFreeType(vipFreeNumType: .general){ return }//判断 vip
  192. guard let upLoadImage = upLoadImage else { return }
  193. let generatorStyle:TSGeneratorImageStyle = .photoExpand
  194. let generatorModel = TSAIListPhotoGeneratorModel(
  195. upLoadImage: upLoadImage,
  196. generatorStyle: generatorStyle,
  197. expandEdge: photoExpand,
  198. expandViewSizes: (expandAreaView.bgImageView.size,expandAreaView.showImageView.size)
  199. )
  200. if let promptModel = generatorStyle.generateModel{
  201. generatorModel.prompt = promptModel.prompt
  202. generatorModel.model = promptModel.model
  203. }
  204. let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel:generatorModel){[weak self] model in
  205. guard let self = self else { return }
  206. updateVipView()
  207. }
  208. gennerateVC.backstageBlock = { [weak self] in
  209. guard let self = self else { return }
  210. self.navigationController?.popToRootViewController(animated: false)
  211. }
  212. kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
  213. }
  214. }