123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- //
- // TSAIExpandImageVC.swift
- // TSLiveWallpaper
- //
- // Created by 100Years on 2025/7/27.
- //
- class TSAIExpandImageVC: TSBaseVC {
-
- var upLoadImage:UIImage?{
- didSet{
- submitBtn.isEnabled = !(upLoadImage == nil)
- expandAreaView.setImage(showImage: upLoadImage)
- }
- }
-
- init(upLoadImage: UIImage?) {
- self.upLoadImage = upLoadImage
- super.init()
- }
-
- @MainActor required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- lazy var viewModel: TSAIExpandImageVM = {
- let viewModel:TSAIExpandImageVM = TSAIExpandImageVM()
- return viewModel
- }()
-
- var photoExpand = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
- lazy var photoPickerManager: TSPhotoPickerManager = {
- let photoPickerManager = TSPhotoPickerManager(viewController: self)
- return photoPickerManager
- }()
- //###################################### topImageView ######################################
- lazy var expandAreaView: TSAIExpandChangeView = {
- let view = TSAIExpandChangeView()
- view.clickAddViewBlock = { [weak self] in
- guard let self = self else { return }
- self.pickSinglePhoto()
- }
- return view
- }()
- //###################################### style类型 ######################################
- lazy var styleView: TSAIExpandStyleView = {
- let styleView = TSAIExpandStyleView()
- styleView.dataArray = viewModel.selectStyleModels
- styleView.currentIndexPath = IndexPath(item: viewModel.selectedStyleIndex, section: 0)
- styleView.selectedValueBlock = { [weak self] model in
- guard let self = self else { return }
- handelSelectedValueBlock(model: model)
- }
- return styleView
- }()
-
- //###################################### 提交按钮 ######################################
- lazy var submitBtn: UIButton = {
- let submitBtn = kCreateNormalSubmitBtn(title: "Expand".localized) { [weak self] in
- guard let self = self else { return }
- generateImage()
- }
- return submitBtn
- }()
- //###################################### createView ######################################
- override func createView() {
- addNormalNavBarView()
- setPageTitle("AI Expand Photo".localized)
- _ = setNavigationItem("", imageName: "replace_photo", direction: .right, action: #selector(clickNavRight))
-
- contentView.addSubview(submitBtn)
- contentView.addSubview(styleView)
- contentView.addSubview(expandAreaView)
- submitBtn.snp.makeConstraints { make in
- make.centerX.equalToSuperview()
- make.width.equalTo(250*kDesignScale)
- make.height.equalTo(48)
- make.bottom.equalTo(-12-k_Height_safeAreaInsetsBottom())
- }
-
- styleView.snp.makeConstraints { make in
- make.bottom.equalTo(submitBtn.snp.top).offset(-36)
- make.leading.trailing.equalTo(0)
- }
-
- expandAreaView.snp.makeConstraints { make in
- make.top.leading.trailing.equalTo(0)
- make.bottom.equalTo(styleView.snp.top).offset(-61)
- }
- let image = upLoadImage
- upLoadImage = image
- updateExpandArea()
- }
-
- override func dealThings() {
- NotificationCenter.default.addObserver(self, selector: #selector(updateVipView), name: .kPurchaseDidChanged, object: nil)
- updateVipView()
- }
-
- @objc func updateVipView() {
- kMainAsync{
- kSetBtnVipIcon(btn: self.submitBtn, show: kPurchaseBusiness.generateVipShow(type: .general))
- }
- }
- }
- extension TSAIExpandImageVC {
-
- @objc func clickNavRight() {
- pickSinglePhoto()
- }
-
- func handelSelectedValueBlock(model:TSGenerateStyleModel) {
- if model.clickType == 2 { //换图
- self.pickSinglePhoto()
- }else{
- viewModel.selectStyleModel = model
- styleView.agreeWillSelectIndexPath()
- updateExpandArea()
- }
- }
-
- func pickSinglePhoto() {
- pickSinglePhoto{ [weak self] image in
- guard let self = self else { return }
- upLoadImage = image
- viewModel.upLoadImage = image
- updateExpandArea()
-
- if upLoadImage == nil {
- pop()
- }
- }
- }
-
- func pickSinglePhoto(complete: @escaping (UIImage)->Void) {
- photoPickerManager.pickPhoto() { [weak self] images in
- guard let self = self else { return }
- if let image = images.first {
- complete(image)
- }else{
- dePrint("图片异常")
- }
-
- self.photoPickerManager.dismissPageVC()
- }
- }
- // MARK: - 更新扩图区域
- private func updateExpandArea() {
- var imageSize = CGSizeMake(500, 500)
- if let upLoadImage = upLoadImage {
- imageSize = upLoadImage.size
- }
-
- let imageAspectRatio = imageSize.width / imageSize.height
- let targetAspectRatio = viewModel.currentRatio.value
- let maxSize = expandAreaView.maxSize
- dePrint("imageAspectRatio=\(imageAspectRatio)")
- dePrint("targetAspectRatio=\(targetAspectRatio)")
- dePrint("\n")
-
- var expandWidth: CGFloat
- var expandHeight: CGFloat
-
- if targetAspectRatio >= 1.0 {
- // 以宽度为基准
- expandWidth = maxSize.width
- expandHeight = expandWidth / targetAspectRatio
- }else {
- // 以高度为基准
- expandHeight = maxSize.height
- expandWidth = expandHeight * targetAspectRatio
- }
-
- // 确保扩图区域不超过最大限制(100%)
- let maxExpandWidth = maxSize.width
- let maxExpandHeight = maxSize.height
- print("\n")
- expandWidth = min(expandWidth, maxExpandWidth)
- expandHeight = min(expandHeight, maxExpandHeight)
-
- print("expandWidth=\(expandWidth)")
- print("expandHeight=\(expandHeight)")
- print("\n")
-
- let difference = abs(targetAspectRatio - imageAspectRatio) <= 0.01
- print("targetAspectRatio=\(targetAspectRatio),imageAspectRatio=\(imageAspectRatio),difference=\(difference)")
-
- // 使用 SnapKit 更新约束
- expandAreaView.updateExpandAreaView(width: expandWidth, height: expandHeight)
- let imageRatio = min(expandWidth/imageSize.width,expandHeight/imageSize.height)
- var scaleFactor = 1.0
- if difference {
- scaleFactor = 0.67
- }
-
- let imageViewW = imageSize.width * imageRatio * scaleFactor
- let imageViewH = imageSize.height * imageRatio * scaleFactor
-
- dePrint("expandWidth=\(imageViewW)")
- dePrint("expandHeight=\(imageViewH)")
-
- expandAreaView.updateImageView(width: imageViewW, height: imageViewH)
-
- let ws = expandWidth/imageViewW - 1.0
- let hs = expandHeight/imageViewH - 1.0
-
- if difference {
- photoExpand = UIEdgeInsets(top: 0.25, left: 0.25, bottom: 0.25, right: 0.25)
- }else{
- photoExpand = UIEdgeInsets(top: hs/2.0, left: ws/2.0, bottom: hs/2.0, right: ws/2.0)
- }
-
- print("ws=\(ws),hs=\(hs)")
- print("postEdge=\(photoExpand)")
-
- UIView.animate(withDuration: 0.3) {
- self.expandAreaView.layoutIfNeeded()
- }
- }
- }
- extension TSAIExpandImageVC {
-
- func generateImage() {
- if kPurchaseBusiness.kJudgeVipFreeType(vipFreeNumType: .general){ return }//判断 vip
-
- guard let upLoadImage = upLoadImage else { return }
- let generatorStyle:TSGeneratorImageStyle = .photoExpand
- let generatorModel = TSAIListPhotoGeneratorModel(
- upLoadImage: upLoadImage,
- generatorStyle: generatorStyle,
- expandEdge: photoExpand,
- expandViewSizes: (expandAreaView.bgImageView.size,expandAreaView.showImageView.size)
- )
-
- if let promptModel = generatorStyle.generateModel{
- generatorModel.prompt = promptModel.prompt
- generatorModel.model = promptModel.model
- }
-
-
- let gennerateVC = TSAIListPhotoGeneratorVC(generatorModel:generatorModel){[weak self] model in
- guard let self = self else { return }
- updateVipView()
- }
-
- gennerateVC.backstageBlock = { [weak self] in
- guard let self = self else { return }
- self.navigationController?.popToRootViewController(animated: false)
- }
- kPresentModalVC(target: self, modelVC: gennerateVC,transitionStyle: .crossDissolve)
- }
- }
|