123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343 |
- //
- // TSAIRemovePhotoBgVC.swift
- // TSLiveWallpaper
- //
- // Created by 100Years on 2025/7/21.
- //
- import Kingfisher
- class TSAIRemovePhotoBgVC: TSBaseVC {
-
- var originalImage:UIImage
- init(image: UIImage) {
- self.originalImage = image
- super.init()
- }
-
- @MainActor required init?(coder: NSCoder) {
- fatalError("init(coder:) has not been implemented")
- }
- lazy var photoPickerManager: TSPhotoPickerManager = TSPhotoPickerManager(viewController: self)
- var isSavePhotoMark:Bool = false
- var isNeedSavePhoto:Bool {
- if isSavePhotoMark == false,let _ = infoModel {
- return true
- }
- return false
- }
- var infoModel:TSActionInfoModel?{
- didSet{
- updateImageView()
- }
- }
-
- var operation:TSGenerateBaseOperation?
- var uuidString:String = UUID().uuidString
- var progressState = TSProgressState.none
-
- lazy var shareBtn: TSVerticalButton = {
- let shareBtn = TSVerticalButton()
- shareBtn.setUpButton(title: "Share".localized,
- image: .share,
- font: .font(name:.ZillaSlab,size: 14,weight: .medium),
- titleColor: .white,
- autoMirrored: false){ [weak self] in
- guard let self = self else { return }
- clickShare()
- }
- shareBtn.contentEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)
- shareBtn.titleLabel?.layer.shadowColor = UIColor.black.cgColor
- shareBtn.titleLabel?.layer.shadowOffset = CGSize(width: 0, height: 2)
- shareBtn.titleLabel?.layer.shadowRadius = 3
- shareBtn.titleLabel?.layer.shadowOpacity = 0.4
- shareBtn.titleLabel?.layer.masksToBounds = false
- return shareBtn
- }()
- lazy var saveBtn: UIButton = {
- let saveBtn = kCreateNormalSubmitBtn(title: "Save".localized) { [weak self] in
- guard let self = self else { return }
- clickSaveBtn()
- }
- kSetBtnVipIcon(btn: saveBtn, show: true)
- return saveBtn
- }()
- lazy var removeView: TSAIPhotoRemoveBgView = {
- let removeView = TSAIPhotoRemoveBgView(targetVC: self)
- removeView.setFrontImage(image: originalImage)
- // removeView.clickImageViewBlock = { [weak self] in
- // guard let self = self else { return }
- // clickNavRight()
- // }
- return removeView
- }()
-
- lazy var generateInView : TSGeneratorView = {
- let generateInView = TSGeneratorView()
- generateInView.isUploadImage = false
- generateInView.backgroundColor = .black.withAlphaComponent(0.95)
- generateInView.animationView.setText(time: String(format: "~ %d mins".localized, 1), info: "Lots of people are processing images right now, so this might take a bit.".localized)
- generateInView.clickErrorBlock = { [weak self] style in
- guard let self = self else { return }
-
- switch style {
- case .netWorkError:
- clickRegenerateBtn()
- default:
- self.cancelDidmiss()
- break
- }
- }
- // generateInView.clickBackstageBlock = { [weak self] in
- // guard let self = self else { return }
- // clickBackstageBtn()
- // }
- generateInView.clickCloseBlock = { [weak self] in
- guard let self = self else { return }
- closePage()
- }
- return generateInView
- }()
-
- //重新生成
- @objc func clickRegenerateBtn(){
- if kPurchaseBusiness.kJudgeVipFreeType(vipFreeNumType: .generalRemoveBg){ return }//判断 vip
- generatorOperation()
- }
- func updateImageView(){
- guard let infoModel = self.infoModel else { return }
- removeView.setFrontImageURLString(urlString: infoModel.response.resultUrl)
- }
-
- func closePage() {
-
- if progressState.isResult {
- if isNeedSavePhoto{
- TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
- message: "You haven't saved the photo yet. Are you sure to quit?".localized,
- messageColor: .white,
- messageFont: .systemFont(ofSize: 16),
-
- cancelTitle: "Quit".localized,
- cancelColor: .white,
-
- confirmTitle: "Save".localized,
- confirmColor: .themeColor,
-
- cancelAction: { [weak self] in
- guard let self = self else { return }
- print("用户点击了Leave")
- cancelDidmiss()
- },
- confirmAction: { [weak self] in
- guard let self = self else { return }
- print("用户点击了Stay")
- clickSaveBtn()
- }
- ))
- }else{
- cancelDidmiss()
- }
- }else{
- TSCustomAlertController.show(in: self, config: TSCustomAlertController.AlertConfig(
- message: "As you leave, your task will be interrupted and no result.".localized,
- messageColor: .white,
- messageFont: .systemFont(ofSize: 16),
-
- cancelTitle: "Leave".localized,
- cancelColor: .white,
-
- confirmTitle: "Wait".localized,
- confirmColor: .themeColor,
-
- cancelAction: { [weak self] in
- guard let self = self else { return }
- print("用户点击了Leave")
- if let model = infoModel{
- TSRMShared.aiListDB.deleteListModel(id: model.id)
- NotificationCenter.default.post(name: .kAIPhotoDataChanged, object: nil)
- }
- cancelDidmiss()
- },
- confirmAction: {
- print("用户点击了Stay")
- }
- ))
- }
- }
- func cancelDidmiss(){
- operation?.cancel()
- self.pop()
- }
-
-
- override func createView() {
- setPageTitle("Remove Background".localized)
- // _ = setNavigationItem("", imageName: "replace_photo", direction: .right, action: #selector(clickNavRight))
- contentView.addSubview(removeView)
- removeView.snp.makeConstraints { make in
- make.edges.equalToSuperview()
- }
-
-
- let bottomBtnTop:CGFloat = -8-k_Height_safeAreaInsetsBottom()
- contentView.addSubview(shareBtn)
- shareBtn.snp.makeConstraints { make in
- make.leading.equalTo(16)
- make.width.equalTo(shareBtn.intrinsicContentSize.width)
- make.height.equalTo(48)
- make.bottom.equalTo(bottomBtnTop)
- }
-
- contentView.addSubview(saveBtn)
- saveBtn.snp.makeConstraints { make in
- make.leading.equalTo(shareBtn.snp.trailing).offset(40)
- make.trailing.equalTo(-16.0)
- make.height.equalTo(48)
- make.bottom.equalTo(bottomBtnTop)
- }
-
-
- view.addSubview(generateInView)
- generateInView.snp.makeConstraints { make in
- make.edges.equalToSuperview()
- }
- }
-
- override func dealThings() {
- self.uuidString = UUID().uuidString
- generatorOperation()
- }
-
- func generatorOperation() {
- generatorNew()
- }
- }
- extension TSAIRemovePhotoBgVC {
- //分享功能
- @objc func clickShare(){
- if kJudgeVip(externalBool: true, vc: self){ return }
- removeView.compositeImages { [weak self] image in
- guard let self = self else { return }
- if let image = image {
- kShareContent(target: self, anyData: image)
- isSavePhotoMark = true
- if let resultUrl = self.infoModel?.response.resultUrl{
- // TSImageStoreTool.storeImage(image: image, urlString: resultUrl)
- TSImagePhotoDiskTool.saveDiskImage(image: image, urlString: resultUrl)
- }
- }
- }
- }
-
- // @objc func clickNavRight() {
- // if kPurchaseBusiness.kJudgeVipFreeType(vipFreeNumType: .generalRemoveBg){ return }//判断 vip
- // photoPickerManager.pickPhoto(maxSelected: 1) { [weak self] images in
- // guard let self = self else { return }
- // if let image = images.first {
- // originalImage = image
- // removeView.setFrontImage(image: originalImage)
- // }
- // self.photoPickerManager.dismissPageVC()
- // }
- // }
-
- //保存功能
- @objc func clickSaveBtn(){
- if kJudgeVip(externalBool: true, vc: self){ return }
- removeView.compositeImages { [weak self] image in
- if let image = image {
- PhotoManagerShared.saveImageToAlbum(image) { [weak self] success, error in
- guard let self = self else { return }
- if success {
- isSavePhotoMark = true
- kSaveSuccesswShared.show(atView:self.view)
- if let resultUrl = self.infoModel?.response.resultUrl{
- // TSImageStoreTool.storeImage(image: image, urlString: resultUrl)
- TSImagePhotoDiskTool.saveDiskImage(image: image, urlString: resultUrl)
- }
- }else{
- debugPrint(error)
- }
- }
- }
- }
- }
- }
- extension TSAIRemovePhotoBgVC{
-
- func generatorNew() {
- let operation:TSGenerateBasePhotoOperation = TSGenerateBasePhotoOperationQueue.shared.creatOperation(uuid: self.uuidString)
- self.operation = operation
- operation.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self] (state,model) in
- guard let self = self else { return }
- self.upDateView(state: state, model: model)
- }.store(in: &cancellable)
-
-
- let generatorModel = TSAIListPhotoGeneratorModel(upLoadImage: originalImage, generatorStyle: .removeBg)
-
- operation.uploadImage(generateStyleModel: generatorModel) { [weak self] actionInfoModel in
- guard let self = self else { return }
- guard let oldModel = actionInfoModel else {return}
- generatorCreatRing(oldModel: oldModel)
- }
- }
-
- func generatorCreatRing(oldModel:TSActionInfoModel) {
- let operation:TSGenerateBasePhotoOperation = TSGenerateBasePhotoOperationQueue.shared.creatOperation(uuid: self.uuidString)
- self.operation = operation
- operation.$stateDatauPblished.receive(on: DispatchQueue.main).sink {[weak self] (state,model) in
- guard let self = self else { return }
- self.upDateView(state: state, model: model)
- }.store(in: &cancellable)
-
- operation.creatImage(oldModel: oldModel){ [weak self] success in
- guard let self = self else { return }
- if success {
- generateInView.setBackgroundGenerateBtnHidden(true)
- }
- }
- }
- }
- extension TSAIRemovePhotoBgVC {
- func upDateView(state:TSProgressState,model:TSActionInfoModel?){
- progressState = state
- switch state {
- case .failed(let errorStr,let code):
- showError(text: errorStr,code:code)
- case .success:
- if let model = model {
- showSuccess(model: model)
- }else{
- showError(text: "")
- }
- case .progressString(let string):
- showProgress(text: string)
- default:
- showLoading()
- }
- }
-
- func showProgress(text:String) {
- generateInView.updateShowProgress(text: text)
- }
-
- func showLoading(){
- generateInView.updateShowLoading(text: "Processing".localized + " " + kPercentlocalized(0))
- }
-
- func showError(text:String,code:Int = 0){
- generateInView.updateShowError(text: text,code: code)
- }
-
- func showSuccess(model:TSActionInfoModel){
- generateInView.updateShowSuccess()
- infoModel = model
- if let model = infoModel {
- // complete(model)
- }
- }
- }
|