鱼C论坛

 找回密码
 立即注册
查看: 49|回复: 7

[基础知识] manus+dp+豆包+trae+剪映生成小说动漫尝试--脱光了分享

[复制链接]
发表于 4 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 快速收敛 于 2025-5-16 11:47 编辑

根据不二分享的教程DeepSeek+番茄小说==一天一部短篇小说·月入3W的秘密!

看到月入3W,来了兴致,决定尝试弄弄。

首先里面讲到用番茄小说,懒得下,刚好最近manus开放注册,使用manus生成一步修仙类型的小说,由于积分不足,完整小说没有生成成功。不过没关系,我就使用小说第一章内容来制作视频。

c9b7b081-9caf-4c3d-bfd5-a5c30305b88c.png

第一章具体内容,并放入dp中生成简短的。
第一章 废物少年与神秘烘炉
夜凉如水,寒意刺骨。残月如一弯冰冷的镰刀,无力地悬挂在墨色的天穹,稀疏的星光如同被冻结的泪珠, 无力地洒落在落云镇林家寂静的后山。

林辰蜷缩在一块棱角分明的巨石之后,身体的每一处都在叫嚣着剧痛。他紧咬着牙关,努力不让自己发出一丝懦弱的呻吟,尽管那深入骨髓的疼痛几乎要将他的意志碾碎。冰冷的夜风如同无形的鬼爪,一次次穿透他单薄的衣衫,带走他身上本就所剩无几的暖意,也让身上的伤口愈发狰狞可怖。嘴角残留的血迹早已凝固,变成了暗红色,映衬着他苍白而倔强的脸庞。

“林海!林豹!你们这群仗势欺人的狗东西!今日之辱,我林辰他日必百倍奉还!”林辰在心中无声地咆哮,每一个字都充满了血与泪。白日里在演武场上被同族子弟肆意欺凌的画面,如同梦魇般在他脑海中反复回放。林海那张扭曲而得意的脸,林豹那充满鄙夷的眼神,以及周围那些族人冷漠的、甚至带着几分幸灾乐祸的目光,都像一根根淬毒的钢针,狠狠扎在他的心上,让他痛不欲生。

他,林辰,林家旁系子弟,一个连父母是谁都只剩下模糊记忆的孤儿。在这个以武道为尊,血脉天赋决定一切的灵源大陆,他却像是被上天遗弃的敝履。灵根驳杂不堪,资质平庸至极,自小便被冠以“林家第一废物”的恶名。整整十六年,他耗费了无数心血,日夜苦修,却依旧死死地卡在炼体三重这个可悲的境界,连家族中最粗浅的入门拳法《碎石拳》都使得有气无力,软绵绵得像是在给敌人挠痒。他早已成为了整个落云镇街头巷尾的笑柄,是人们茶余饭后用来消遣的谈资。

今天,他又因为一件微不足道的小事——仅仅是在修炼时无意中挡了林海的路——便被那群嫡系子弟堵在演武场,当着众人的面,进行了一场单方面的、极尽羞辱的殴打。若非一位平日里对他还算有几分怜悯的老执事恰巧路过,出言喝止,恐怕他今天就要被那群畜生生生打死在演武场上,落得个尸骨无存的下场。

“力量……我需要力量!我渴望拥有撕裂一切不公的力量!”林辰用尽全身力气,一拳狠狠地砸在身下的巨石之上。指节瞬间皮开肉绽,碎裂的骨骼传来阵阵钻心的剧痛,但他仿佛感觉不到一般,任由温热的鲜血染红了冰冷的石面。在这个残酷的世界上,没有实力,就意味着任人宰割,就意味着连最基本的尊严都如同风中残烛,随时可能被无情地吹灭。他不想再过这种猪狗不如的日子!他不想再看到任何人鄙夷的目光!

他颤抖着手,从早已破旧不堪的衣衫内袋中,摸出一块通体漆黑、毫不起眼的鹅卵石。这块石头约莫有婴儿拳头大小,表面粗糙,没有任何奇异之处,是他那对早已逝去的父母留给他的唯一遗物。自他记事起,这块石头便一直佩戴在他身上,承载了他对双亲所有的模糊思念与孺慕之情。他曾无数次在孤寂绝望的夜晚,将所有的希望都寄托在这块冰冷的石头上,一遍遍地幻想它是什么隐藏于世的绝世宝贝,能够助他脱胎换骨,逆天改命,摆脱这令人窒息的“废物”命运。然而,现实一次又一次地将他幼稚的幻想无情击碎。这块石头,除了比寻常的石头更加坚硬一些,似乎真的没有任何特异之处。

“爹……娘……”林辰的声音哽咽了,积压在心中多年的委屈与不甘在这一刻如同决堤的洪水般汹涌而出。温热的泪水终于忍不住夺眶而出,混着嘴角的血迹,顺着他消瘦的脸颊无声滑落。“孩儿无能……不仅无法查明你们当年失踪的真相,为你们报仇雪恨,甚至连自己都保护不了,还要受这等奇耻大辱……让你们在九泉之下都不得安宁……我……我真是个天大的废物啊!”无尽的悲愤与绝望如同潮水般将他淹没,他将那块鹅卵石死死地攥在掌心,锋利的石棱深深地刺入皮肉,鲜血汩汩而出,染红了那块漆黑的石头,也浸湿了他心中最后一点微弱的希望之火。

就在这时,异变陡生!

那块被林辰鲜血浸染的黑色鹅卵石,毫无征兆地爆发出了一团濛濛的、深邃的乌光!那光芒并不刺眼,却仿佛蕴含着某种来自亘古洪荒的神秘力量。紧接着,一道道细密如蛛网般的裂纹,以肉眼可见的速度在石头表面迅速蔓延开来。“咔嚓”一声清脆的碎裂声响起,在寂静的夜空中显得格外清晰。那块陪伴了林辰十多年的鹅卵石,应声碎裂!

林辰被眼前这突如其来的一幕惊得目瞪口呆,甚至忘记了身上的疼痛。还没等他从震惊中回过神来,从那碎裂的鹅卵石核心之中,骤然射出了一缕细若游丝,却又仿佛蕴含着开天辟地般伟力的鸿蒙紫气!那紫气灵动异常,如同拥有生命一般,在空中划过一道玄奥的轨迹,瞬间便没入了林辰的眉心祖窍之中!

“呃啊——!”

一股难以用言语形容的剧痛,如同火山爆发般猛地在林辰的脑海中炸开!他感觉自己的脑袋仿佛要被一股无形的力量硬生生撕裂,灵魂像是被投入了一个正在熊熊燃烧的巨大熔炉之中,被反复锤炼、锻打、碾压。与此同时,无数玄奥繁复、晦涩难明的信息,如同决堤的洪流一般,疯狂地涌入他的意识海洋,冲击着他浅薄的认知,颠覆着他对这个世界的理解。

他仿佛看到了宇宙的诞生与毁灭,星辰的轮转与寂灭,万物的起源与终结……也仿佛看到了无数惊天动地的功法神通的奥秘,丹道阵法的无上精髓……这些信息是如此的浩瀚、如此的深邃,远非他一个小小的炼体三重修士所能理解和承受。

不知过了多久,或许只是一瞬,又或许是千百年。那股几乎要将他灵魂撕碎的剧痛,如同潮水般渐渐消退。取而代之的,是一种前所未有的清明与通透,仿佛整个世界在他眼中都变得不一样了。林辰缓缓睁开双眼,那双原本黯淡无光的眸子里,此刻不再是迷茫与不甘,而是充满了难以置信的震惊与难以抑制的狂喜。

在他的识海之中,一座古朴无华的青铜小鼎,正静静地悬浮在那里。鼎高约三寸,三足两耳,通体呈现出一种深沉的青黑色,仿佛经历了无尽岁月的洗礼。鼎身之上,布满了玄奥繁复、不可名状的道纹,每一个符文都仿佛蕴含着天地至理,散发着一股亘古苍凉、至高无上的气息。一股明悟,如同醍醐灌顶般涌上林辰的心头——此鼎,名为“大道烘炉”!

这便是那缕神秘的鸿蒙紫气所化的无上异宝,拥有着解析万法根源,完美推演功法,加速悟道修行等等不可思议的神奇能力!

“大道烘炉……”林辰心念微微一动,尝试着在脑海中回忆家族那部粗浅不堪的基础功法《碎石拳》的修炼法门。

刹那之间,他识海中那座古朴的青铜小鼎微微一震,鼎口处射出一道柔和的微光,瞬间便将《碎石拳》的所有修炼法门尽数笼罩。紧接着,林辰的脑海中便如同醍醐灌顶一般,清晰无比地浮现出《碎石拳》的每一处运气路线,每一分发力技巧,甚至连其中存在的几处细微的缺陷和可以改进的地方,都以一种他从未想象过的方式,完美地呈现在他的面前!

“原来是这样……这《碎石拳》的发力方式太过粗糙,简直是暴殄天物!若是将这几处关键经脉的灵力运转轨迹稍作调整,再配合这种独特的呼吸法门,其威力至少能提升三成以上!不,甚至可能达到五成!”林辰心中豁然开朗,仿佛一瞬间打开了一扇通往全新世界的大门。以往那些困扰他许久,百思不得其解的修炼难题,在“大道烘炉”的解析之下,都变得如此简单明了。

他几乎是迫不及待地从地上翻身而起,强忍着身上的伤痛,按照“大道烘炉”推演出的完美版本《碎石拳》开始修炼。原本在他看来晦涩难懂、难以掌握的运气法门,此刻在他眼中却变得简单得如同呼吸一般自然。体内那本就稀薄的灵力,此刻却以前所未有的顺畅姿态,在他经过优化的经脉中飞速流转。每一次出拳,都带着一股以往从未有过的凌厉劲风,拳风呼啸,隐隐有破空之声!

“呼……哈!”

林辰一遍又一遍地演练着,完全沉浸在这种奇妙的感觉之中,甚至忘记了时间的流逝和身上的伤痛。他能清晰地感觉到,自己的力量在一点一滴地增强,对拳法的理解也在以一种不可思议的速度飞速提升。

仅仅一个时辰之后,他便将这套经过“大道烘炉”完美优化的《碎石拳》,修炼到了炉火纯青、登堂入室的大成境界!这在以前,是他连做梦都不敢想象的事情!要知道,家族中那些所谓的天才,将这套基础拳法修炼到大成,也至少需要数月之功!

“炼体三重巅峰……不,似乎已经隐隐触摸到炼体四重的壁垒了!”林辰收拳而立,仔细感受着体内那股远比之前充盈了数倍的力量,以及丹田中那颗微微壮大了一圈的灵力种子,脸上露出了难以置信的狂喜之色。

这“大道烘炉”,简直就是为他量身打造的逆天外挂!有了它,何愁不能摆脱废物的名头?何愁不能将那些曾经欺辱他、嘲笑他的人狠狠踩在脚下?

他深吸一口气,努力平复下因为过度激动而剧烈起伏的心情。他知道,从今天起,他林辰的命运,将因为这“大道烘炉”的出现,而发生翻天覆地的改变!那些曾经高高在上,视他如蝼蚁的家伙们,终将为他们的所作所为,付出惨重的代价!

“林海,林豹……还有林家那些看不起我的人,你们给我等着!我们很快就会再见面的!”林辰的眼中闪过一丝冰冷的寒芒,嘴角却勾起了一抹充满了自信与期待的笑容。

夜色依旧深沉,寒风依旧凛冽。但林辰的心中,却已然升起了一轮足以照亮整个黑暗的骄阳。他的修仙之路,从这一刻起,才算真正开始!而这座神秘莫测的“大道烘炉”,必将成为他在这波澜壮阔、危机四伏的修仙世界之中,披荆斩棘,逆天改命,最终登临绝顶的,最大、也是最可靠的依仗!

要求:提取抖音里的爆款逻辑,将上面这章篇幅润色控制在2000字左右。

开始也是按教程,让dp生成分镜,但是复制到剪映里面发现并不需要分镜,只需要故事就行。由于剪映只支持3000字故事成片,所以这里我让dp修改为2000字左右,但实际返回的内容只有500多字。以下是dp返回的结果:
残月如钩,林辰蜷缩在后山裂石后。鲜血从十七道伤口渗出,在零下寒气中凝成冰渣。

"林家嫡系的狗,今日之辱必百倍偿还!"少年染血的指甲深深抠进冻土。三小时前,他因挡了林海的路,被当众扒光上衣鞭笆——这是今年第七次羞辱直播。

作为林家著名废柴,16岁卡在炼体三重。而嫡系子弟林海,上月刚突破炼体七重。

"废物就该像蛆虫爬行!"记忆里林海踩着他头颅狞笑,四周传来嫡系子弟的哄笑。最刺痛的是远处白衣少女的目光——那个曾与他青梅竹马的林家大小姐林清雪,此刻正冷漠地擦拭佩剑。

突然,贴身十六年的黑卵石发出灼热。这是父母唯一遗物,此刻竟吸饱鲜血开始龟裂。

"轰!"

紫光炸裂的瞬间,林辰瞳孔收缩。他看到宇宙坍缩成青铜鼎纹,洪荒道音在脑内轰鸣:【大道烘炉激活,可解析万法本源】

剧痛中,家族《碎石拳》自动分解重构——

"原来第三式气走天枢是错的!"林辰颤抖着挥拳,空气竟发出爆鸣。原本需要蓄力三秒的招式,如今0.3秒就能轰出!

体内灵力疯狂奔涌,停滞三年的境界开始松动。当青铜鼎纹在识海显现时,少年浑身骨节爆响,炼体四重的气息震碎周身冰霜。

"林海,七日后族比..."他撕下染血衣襟系在眼上,嘴角咧开癫狂弧度:"我要你跪着舔干净演武场!"


复制到剪映故事成片,发现成片只有免费一次额度,需要开通svip,为了测试,想着月入3w,忍痛不小心开通了一个月的svip

开通后,就可以愉快的生成视频了 ,但是也只有3000多积分,并且一个月会清零,那就不能浪费了。

开始制作视频............. ,我的月入3W等着我......

C4998DE2864AC2313FB047B16DCF8211.jpg
87A3F38A59B5CBD787B94A86E9932E2D.jpg

选择文案:刚生成的内容
选择风格:仙侠古风
分镜素材:智能分镜,这里有两种,图片分镜和智能分镜,图片分镜,根据内容只生成图片。智能分镜会将图片转化为视频,经测试,只有部分分镜转化为动态视频,大部分分镜还是图片。:
配音:按自己喜好,我选择的是古风男主
语速:默认
背景音乐:智能推荐
视频比例:我选择16:9

开始生成视频,等待结果.....................

生成完毕后,发现视频少了点东西,缺那么一点意思,那就是封面,视频里面截取的画面做封面体现不了第一章的主题,好吧,那就生成一个吧,找找发现豆包生成图片还不错,这里我使用豆包生成图片,如图
50c51a4d-e370-4388-b778-2bbf4bc4cda8.png

我选择了第一张

但是在剪映里面剪辑,发现封面是不是动态一点要帅一点,毕竟男人嘛,耍帅最重要!

找来找去,豆包也可以图片视频化,那就继续用豆包生成吧,如图
89f05924-d4a1-4207-b606-4919cb152da5.png

完美生成,效果也还不错,但是有水印,这是什么鬼......

好吧,那就去掉水印 ,不会怎么办,当然是找AI来帮忙

这里寻求AI的帮忙,让AI帮忙生成去水印的代码,利用tare工具生成python代码:

这是文件watermark_remover_gui.py
  1. import tkinter as tk
  2. from tkinter import filedialog, messagebox, ttk
  3. import os
  4. import threading
  5. import cv2
  6. from watermark_remover import VideoWatermarkRemover

  7. class VideoWatermarkRemoverGUI:
  8.     def __init__(self, root):
  9.         self.root = root
  10.         self.root.title("视频去水印工具")
  11.         self.root.geometry("600x400")
  12.         self.root.resizable(True, True)
  13.         
  14.         # 设置样式
  15.         self.style = ttk.Style()
  16.         self.style.configure("TButton", font=("Arial", 10))
  17.         self.style.configure("TLabel", font=("Arial", 10))
  18.         
  19.         # 创建主框架
  20.         main_frame = ttk.Frame(root, padding="10")
  21.         main_frame.pack(fill=tk.BOTH, expand=True)
  22.         
  23.         # 输入视频选择
  24.         input_frame = ttk.Frame(main_frame)
  25.         input_frame.pack(fill=tk.X, pady=5)
  26.         
  27.         ttk.Label(input_frame, text="输入视频:").pack(side=tk.LEFT, padx=5)
  28.         self.input_path_var = tk.StringVar()
  29.         ttk.Entry(input_frame, textvariable=self.input_path_var, width=50).pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)
  30.         ttk.Button(input_frame, text="浏览...", command=self.browse_input).pack(side=tk.LEFT, padx=5)
  31.         
  32.         # 输出视频选择
  33.         output_frame = ttk.Frame(main_frame)
  34.         output_frame.pack(fill=tk.X, pady=5)
  35.         
  36.         ttk.Label(output_frame, text="输出视频:").pack(side=tk.LEFT, padx=5)
  37.         self.output_path_var = tk.StringVar()
  38.         ttk.Entry(output_frame, textvariable=self.output_path_var, width=50).pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)
  39.         ttk.Button(output_frame, text="浏览...", command=self.browse_output).pack(side=tk.LEFT, padx=5)
  40.         
  41.         # 水印区域设置
  42.         region_frame = ttk.Frame(main_frame)
  43.         region_frame.pack(fill=tk.X, pady=5)
  44.         
  45.         ttk.Label(region_frame, text="水印区域:").pack(side=tk.LEFT, padx=5)
  46.         
  47.         # 创建水印区域输入框
  48.         coords_frame = ttk.Frame(region_frame)
  49.         coords_frame.pack(side=tk.LEFT, fill=tk.X, expand=True)
  50.         
  51.         # X坐标
  52.         x_frame = ttk.Frame(coords_frame)
  53.         x_frame.pack(side=tk.LEFT, padx=2)
  54.         ttk.Label(x_frame, text="X:").pack(side=tk.LEFT)
  55.         self.x_var = tk.StringVar()
  56.         ttk.Entry(x_frame, textvariable=self.x_var, width=5).pack(side=tk.LEFT)
  57.         
  58.         # Y坐标
  59.         y_frame = ttk.Frame(coords_frame)
  60.         y_frame.pack(side=tk.LEFT, padx=2)
  61.         ttk.Label(y_frame, text="Y:").pack(side=tk.LEFT)
  62.         self.y_var = tk.StringVar()
  63.         ttk.Entry(y_frame, textvariable=self.y_var, width=5).pack(side=tk.LEFT)
  64.         
  65.         # 宽度
  66.         w_frame = ttk.Frame(coords_frame)
  67.         w_frame.pack(side=tk.LEFT, padx=2)
  68.         ttk.Label(w_frame, text="宽:").pack(side=tk.LEFT)
  69.         self.w_var = tk.StringVar()
  70.         ttk.Entry(w_frame, textvariable=self.w_var, width=5).pack(side=tk.LEFT)
  71.         
  72.         # 高度
  73.         h_frame = ttk.Frame(coords_frame)
  74.         h_frame.pack(side=tk.LEFT, padx=2)
  75.         ttk.Label(h_frame, text="高:").pack(side=tk.LEFT)
  76.         self.h_var = tk.StringVar()
  77.         ttk.Entry(h_frame, textvariable=self.h_var, width=5).pack(side=tk.LEFT)
  78.         
  79.         # 自动检测选项
  80.         self.auto_detect_var = tk.BooleanVar(value=True)
  81.         ttk.Checkbutton(region_frame, text="自动检测", variable=self.auto_detect_var,
  82.                        command=self.toggle_region_inputs).pack(side=tk.LEFT, padx=5)
  83.         
  84.         # 视频尺寸信息
  85.         video_info_frame = ttk.Frame(main_frame)
  86.         video_info_frame.pack(fill=tk.X, pady=5)
  87.         ttk.Label(video_info_frame, text="视频尺寸:").pack(side=tk.LEFT, padx=5)
  88.         self.video_size_var = tk.StringVar(value="未加载")
  89.         ttk.Label(video_info_frame, textvariable=self.video_size_var).pack(side=tk.LEFT, padx=5)
  90.         
  91.         # 预览按钮
  92.         preview_frame = ttk.Frame(main_frame)
  93.         preview_frame.pack(fill=tk.X, pady=5)
  94.         ttk.Button(preview_frame, text="预览水印区域", command=self.preview_watermark).pack(side=tk.LEFT, padx=5)
  95.         ttk.Button(preview_frame, text="鼠标框选水印", command=self.select_watermark_by_mouse).pack(side=tk.LEFT, padx=5)
  96.         
  97.         # 进度条
  98.         progress_frame = ttk.Frame(main_frame)
  99.         progress_frame.pack(fill=tk.X, pady=10)
  100.         ttk.Label(progress_frame, text="处理进度:").pack(side=tk.LEFT, padx=5)
  101.         self.progress_var = tk.DoubleVar()
  102.         self.progress_bar = ttk.Progressbar(progress_frame, variable=self.progress_var, length=100, mode="determinate")
  103.         self.progress_bar.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)
  104.         
  105.         # 状态标签
  106.         self.status_var = tk.StringVar(value="就绪")
  107.         status_label = ttk.Label(main_frame, textvariable=self.status_var)
  108.         status_label.pack(fill=tk.X, pady=5)
  109.         
  110.         # 按钮框架
  111.         button_frame = ttk.Frame(main_frame)
  112.         button_frame.pack(fill=tk.X, pady=10)
  113.         
  114.         # 开始处理按钮
  115.         self.process_button = ttk.Button(button_frame, text="开始处理", command=self.start_processing)
  116.         self.process_button.pack(side=tk.RIGHT, padx=5)
  117.         
  118.         # 初始化状态
  119.         self.processing = False
  120.         self.toggle_region_inputs()
  121.    
  122.     def toggle_region_inputs(self):
  123.         """启用或禁用水印区域输入框"""
  124.         state = "disabled" if self.auto_detect_var.get() else "normal"
  125.         for entry_var in [self.x_var, self.y_var, self.w_var, self.h_var]:
  126.             for child in self.root.winfo_children():
  127.                 self._set_state(child, entry_var, state)
  128.    
  129.     def _set_state(self, parent, var, state):
  130.         """递归设置控件状态"""
  131.         for child in parent.winfo_children():
  132.             if hasattr(child, 'textvariable') and child.textvariable == var:
  133.                 child.configure(state=state)
  134.             self._set_state(child, var, state)
  135.    
  136.     def browse_input(self):
  137.         """浏览选择输入视频文件"""
  138.         file_path = filedialog.askopenfilename(
  139.             title="选择输入视频",
  140.             filetypes=[("视频文件", "*.mp4 *.avi *.mov *.mkv"), ("所有文件", "*.*")]
  141.         )
  142.         if file_path:
  143.             self.input_path_var.set(file_path)
  144.             # 自动设置输出路径
  145.             base, ext = os.path.splitext(file_path)
  146.             self.output_path_var.set(f"{base}_无水印{ext}")
  147.             
  148.             # 尝试获取视频尺寸
  149.             try:
  150.                 cap = cv2.VideoCapture(file_path)
  151.                 if cap.isOpened():
  152.                     remover = VideoWatermarkRemover(file_path, "", None)
  153.                     width, height = remover.get_video_dimensions(cap)
  154.                     self.video_size_var.set(f"{width} × {height}")
  155.                     cap.release()
  156.                 else:
  157.                     self.video_size_var.set("无法获取尺寸")
  158.             except Exception:
  159.                 self.video_size_var.set("无法获取尺寸")
  160.    
  161.     def browse_output(self):
  162.         """浏览选择输出视频文件"""
  163.         file_path = filedialog.asksaveasfilename(
  164.             title="保存输出视频",
  165.             filetypes=[("MP4视频", "*.mp4"), ("AVI视频", "*.avi"), ("所有文件", "*.*")],
  166.             defaultextension=".mp4"
  167.         )
  168.         if file_path:
  169.             self.output_path_var.set(file_path)
  170.    
  171.     def preview_watermark(self):
  172.         """预览水印区域"""
  173.         input_path = self.input_path_var.get()
  174.         if not input_path or not os.path.isfile(input_path):
  175.             messagebox.showerror("错误", "请先选择有效的输入视频文件")
  176.             return
  177.         
  178.         try:
  179.             # 打开视频并读取第一帧
  180.             cap = cv2.VideoCapture(input_path)
  181.             if not cap.isOpened():
  182.                 messagebox.showerror("错误", f"无法打开视频文件: {input_path}")
  183.                 return
  184.                
  185.             ret, frame = cap.read()
  186.             if not ret:
  187.                 messagebox.showerror("错误", "无法读取视频帧")
  188.                 cap.release()
  189.                 return
  190.             
  191.             # 创建临时的去水印器
  192.             remover = VideoWatermarkRemover(input_path, "", None)
  193.             
  194.             # 获取并显示视频尺寸
  195.             width, height = remover.get_video_dimensions(cap)
  196.             self.video_size_var.set(f"{width} × {height}")
  197.             
  198.             # 如果选择自动检测,尝试检测水印区域
  199.             if self.auto_detect_var.get():
  200.                 self.status_var.set("正在检测水印区域...")
  201.                 self.root.update()
  202.                
  203.                 region = remover._detect_watermark(cap)
  204.                
  205.                 if region is None:
  206.                     messagebox.showwarning("警告", "无法自动检测水印区域,请手动指定")
  207.                     self.auto_detect_var.set(False)
  208.                     self.toggle_region_inputs()
  209.                 else:
  210.                     # 更新UI中的区域值
  211.                     self.x_var.set(str(region[0]))
  212.                     self.y_var.set(str(region[1]))
  213.                     self.w_var.set(str(region[2]))
  214.                     self.h_var.set(str(region[3]))
  215.             
  216.             # 获取水印区域
  217.             try:
  218.                 x = int(self.x_var.get())
  219.                 y = int(self.y_var.get())
  220.                 w = int(self.w_var.get())
  221.                 h = int(self.h_var.get())
  222.                 region = [x, y, w, h]
  223.             except ValueError:
  224.                 if not self.auto_detect_var.get():
  225.                     messagebox.showerror("错误", "请输入有效的水印区域坐标")
  226.                     cap.release()
  227.                     return
  228.                 region = None
  229.             
  230.             if region:
  231.                 # 在帧上绘制水印区域
  232.                 x, y, w, h = region
  233.                 cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)
  234.                
  235.                 # 在预览图像上显示尺寸信息
  236.                 info_text = f"视频尺寸: {width} × {height}, 水印区域: [{x}, {y}, {w}, {h}]"
  237.                 cv2.putText(frame, info_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
  238.                
  239.                 # 显示预览
  240.                 cv2.imshow("水印区域预览", frame)
  241.                 cv2.waitKey(0)
  242.                 cv2.destroyAllWindows()
  243.             
  244.             cap.release()
  245.             self.status_var.set("就绪")
  246.             
  247.         except Exception as e:
  248.             messagebox.showerror("错误", f"预览时发生错误: {str(e)}")
  249.             self.status_var.set("就绪")
  250.             
  251.     def select_watermark_by_mouse(self):
  252.         """使用鼠标框选水印区域"""
  253.         input_path = self.input_path_var.get()
  254.         if not input_path or not os.path.isfile(input_path):
  255.             messagebox.showerror("错误", "请先选择有效的输入视频文件")
  256.             return
  257.         
  258.         try:
  259.             # 打开视频并读取第一帧
  260.             cap = cv2.VideoCapture(input_path)
  261.             if not cap.isOpened():
  262.                 messagebox.showerror("错误", f"无法打开视频文件: {input_path}")
  263.                 return
  264.                
  265.             ret, frame = cap.read()
  266.             if not ret:
  267.                 messagebox.showerror("错误", "无法读取视频帧")
  268.                 cap.release()
  269.                 return
  270.             
  271.             # 创建临时的去水印器
  272.             remover = VideoWatermarkRemover(input_path, "", None)
  273.             
  274.             # 获取并显示视频尺寸
  275.             width, height = remover.get_video_dimensions(cap)
  276.             self.video_size_var.set(f"{width} × {height}")
  277.             
  278.             # 创建一个窗口和鼠标回调函数
  279.             window_name = "框选水印区域 (按住鼠标左键拖动选择,按ESC取消,按Enter确认)"
  280.             cv2.namedWindow(window_name)
  281.             
  282.             # 标记窗口是否已关闭
  283.             self.window_closed = False
  284.             
  285.             # 添加窗口关闭事件处理
  286.             def on_window_close(*args):
  287.                 self.window_closed = True
  288.             
  289.             # 设置窗口关闭回调
  290.             cv2.setWindowProperty(window_name, cv2.WND_PROP_TOPMOST, 1)
  291.             
  292.             # 初始化鼠标选择变量
  293.             self.mouse_selecting = False
  294.             self.selection_start = (-1, -1)
  295.             self.selection_end = (-1, -1)
  296.             self.current_frame = frame.copy()
  297.             
  298.             # 定义鼠标回调函数
  299.             def mouse_callback(event, x, y, flags, param):
  300.                 if event == cv2.EVENT_LBUTTONDOWN:
  301.                     # 开始选择
  302.                     self.mouse_selecting = True
  303.                     self.selection_start = (x, y)
  304.                     self.selection_end = (x, y)
  305.                
  306.                 elif event == cv2.EVENT_MOUSEMOVE and self.mouse_selecting:
  307.                     # 更新选择区域
  308.                     self.selection_end = (x, y)
  309.                
  310.                 elif event == cv2.EVENT_LBUTTONUP:
  311.                     # 完成选择
  312.                     self.mouse_selecting = False
  313.                     self.selection_end = (x, y)
  314.                
  315.                 # 绘制选择框
  316.                 img_copy = frame.copy()
  317.                 if self.selection_start != (-1, -1) and self.selection_end != (-1, -1):
  318.                     start_x, start_y = self.selection_start
  319.                     end_x, end_y = self.selection_end
  320.                     
  321.                     # 确保坐标有序
  322.                     x1, x2 = min(start_x, end_x), max(start_x, end_x)
  323.                     y1, y2 = min(start_y, end_y), max(start_y, end_y)
  324.                     
  325.                     # 绘制矩形
  326.                     cv2.rectangle(img_copy, (x1, y1), (x2, y2), (0, 0, 255), 2)
  327.                     
  328.                     # 显示坐标信息
  329.                     w, h = x2 - x1, y2 - y1
  330.                     info_text = f"选择区域: [{x1}, {y1}, {w}, {h}]"
  331.                     cv2.putText(img_copy, info_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2)
  332.                
  333.                 self.current_frame = img_copy
  334.                 cv2.imshow(window_name, self.current_frame)
  335.             
  336.             # 设置鼠标回调
  337.             cv2.setMouseCallback(window_name, mouse_callback)
  338.             
  339.             # 显示初始帧
  340.             cv2.imshow(window_name, frame)
  341.             
  342.             # 等待用户操作
  343.             while True:
  344.                 # 检查窗口是否存在
  345.                 if self.window_closed or cv2.getWindowProperty(window_name, cv2.WND_PROP_VISIBLE) < 1:
  346.                     break
  347.                     
  348.                 cv2.imshow(window_name, self.current_frame)
  349.                 key = cv2.waitKey(1) & 0xFF
  350.                
  351.                 # 按ESC取消
  352.                 if key == 27:  # ESC键
  353.                     break
  354.                
  355.                 # 按Enter确认
  356.                 if key == 13:  # Enter键
  357.                     if self.selection_start != (-1, -1) and self.selection_end != (-1, -1):
  358.                         start_x, start_y = self.selection_start
  359.                         end_x, end_y = self.selection_end
  360.                         
  361.                         # 确保坐标有序
  362.                         x1, x2 = min(start_x, end_x), max(start_x, end_x)
  363.                         y1, y2 = min(start_y, end_y), max(start_y, end_y)
  364.                         
  365.                         # 计算宽高
  366.                         w, h = x2 - x1, y2 - y1
  367.                         
  368.                         # 更新UI中的坐标值
  369.                         self.x_var.set(str(x1))
  370.                         self.y_var.set(str(y1))
  371.                         self.w_var.set(str(w))
  372.                         self.h_var.set(str(h))
  373.                         
  374.                         # 如果自动检测被选中,取消它
  375.                         if self.auto_detect_var.get():
  376.                             self.auto_detect_var.set(False)
  377.                             self.toggle_region_inputs()
  378.                         
  379.                         # 先关闭所有OpenCV窗口,再显示消息框
  380.                         cv2.destroyAllWindows()
  381.                         cap.release()
  382.                         self.status_var.set("就绪")
  383.                         messagebox.showinfo("成功", f"已选择水印区域: [{x1}, {y1}, {w}, {h}]")
  384.                         return  # 直接返回,避免重复执行后面的清理代码
  385.                     else:
  386.                         messagebox.showwarning("警告", "请先框选一个区域")
  387.             
  388.             # 清理
  389.             cv2.destroyAllWindows()
  390.             cap.release()
  391.             self.status_var.set("就绪")
  392.             
  393.         except Exception as e:
  394.             messagebox.showerror("错误", f"框选水印区域时发生错误: {str(e)}")
  395.             self.status_var.set("就绪")
  396.    
  397.     def start_processing(self):
  398.         """开始处理视频"""
  399.         if self.processing:
  400.             messagebox.showinfo("提示", "正在处理中,请等待完成")
  401.             return
  402.             
  403.         input_path = self.input_path_var.get()
  404.         output_path = self.output_path_var.get()
  405.         
  406.         # 验证输入
  407.         if not input_path or not os.path.isfile(input_path):
  408.             messagebox.showerror("错误", "请选择有效的输入视频文件")
  409.             return
  410.             
  411.         if not output_path:
  412.             messagebox.showerror("错误", "请指定输出视频文件路径")
  413.             return
  414.             
  415.         # 获取水印区域
  416.         region = None
  417.         if not self.auto_detect_var.get():
  418.             try:
  419.                 x = int(self.x_var.get())
  420.                 y = int(self.y_var.get())
  421.                 w = int(self.w_var.get())
  422.                 h = int(self.h_var.get())
  423.                 region = [x, y, w, h]
  424.             except ValueError:
  425.                 messagebox.showerror("错误", "请输入有效的水印区域坐标")
  426.                 return
  427.         
  428.         # 确保输出目录存在
  429.         output_dir = os.path.dirname(output_path)
  430.         if output_dir and not os.path.exists(output_dir):
  431.             try:
  432.                 os.makedirs(output_dir)
  433.             except Exception as e:
  434.                 messagebox.showerror("错误", f"无法创建输出目录: {str(e)}")
  435.                 return
  436.         
  437.         # 开始处理线程
  438.         self.processing = True
  439.         self.process_button.configure(state="disabled")
  440.         self.progress_var.set(0)
  441.         self.status_var.set("正在处理视频...")
  442.         
  443.         thread = threading.Thread(target=self._process_video, args=(input_path, output_path, region))
  444.         thread.daemon = True
  445.         thread.start()
  446.    
  447.     def _process_video(self, input_path, output_path, region):
  448.         """在后台线程中处理视频"""
  449.         try:
  450.             # 创建进度回调函数
  451.             def progress_callback(current, total):
  452.                 progress = (current / total) * 100
  453.                 self.progress_var.set(progress)
  454.                 self.status_var.set(f"正在处理视频... {current}/{total} 帧 ({progress:.1f}%)")
  455.                 self.root.update_idletasks()
  456.             
  457.             # 创建去水印器并处理
  458.             remover = VideoWatermarkRemover(input_path, output_path, region)
  459.             remover.set_progress_callback(progress_callback)
  460.             success = remover.process()
  461.             
  462.             # 更新UI
  463.             if success:
  464.                 self.status_var.set(f"处理完成,已保存到: {output_path}")
  465.                 messagebox.showinfo("完成", f"视频处理完成,已保存到:\n{output_path}")
  466.             else:
  467.                 self.status_var.set("处理失败")
  468.         except Exception as e:
  469.             self.status_var.set(f"处理出错: {str(e)}")
  470.             messagebox.showerror("错误", f"处理视频时发生错误:\n{str(e)}")
  471.         finally:
  472.             self.processing = False
  473.             self.process_button.configure(state="normal")
  474.             self.root.update_idletasks()


  475. def main():
  476.     root = tk.Tk()
  477.     app = VideoWatermarkRemoverGUI(root)
  478.     root.mainloop()


  479. if __name__ == "__main__":
  480.     main()
复制代码


这是文件watermark_remover.py
  1. import cv2
  2. import numpy as np
  3. import argparse
  4. import os

  5. class VideoWatermarkRemover:
  6.     def __init__(self, input_path, output_path, watermark_region=None):
  7.         """
  8.         初始化视频去水印工具
  9.         
  10.         参数:
  11.             input_path: 输入视频路径
  12.             output_path: 输出视频路径
  13.             watermark_region: 水印区域 [x, y, width, height],如果为None则尝试自动检测
  14.         """
  15.         self.input_path = input_path
  16.         self.output_path = output_path
  17.         self.watermark_region = watermark_region
  18.         self.progress_callback = None
  19.         
  20.     def set_progress_callback(self, callback):
  21.         """
  22.         设置进度回调函数
  23.         
  24.         参数:
  25.             callback: 回调函数,接受两个参数 (current_frame, total_frames)
  26.         """
  27.         self.progress_callback = callback
  28.         
  29.     def process(self):
  30.         """
  31.         处理视频并去除水印
  32.         """
  33.         # 打开输入视频
  34.         cap = cv2.VideoCapture(self.input_path)
  35.         if not cap.isOpened():
  36.             raise ValueError(f"无法打开视频文件: {self.input_path}")
  37.             
  38.         # 获取视频属性
  39.         width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
  40.         height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
  41.         fps = cap.get(cv2.CAP_PROP_FPS)
  42.         frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
  43.         
  44.         # 创建视频写入器
  45.         fourcc = cv2.VideoWriter_fourcc(*'mp4v')
  46.         out = cv2.VideoWriter(self.output_path, fourcc, fps, (width, height))
  47.         
  48.         # 如果没有指定水印区域,尝试自动检测
  49.         if self.watermark_region is None:
  50.             print("尝试自动检测水印区域...")
  51.             self.watermark_region = self._detect_watermark(cap)
  52.             cap.set(cv2.CAP_PROP_POS_FRAMES, 0)  # 重置视频到开始位置
  53.             
  54.         if self.watermark_region is None:
  55.             print("无法自动检测水印区域,请手动指定水印区域")
  56.             return False
  57.             
  58.         print(f"处理视频中,水印区域: {self.watermark_region}")
  59.         
  60.         # 处理每一帧
  61.         processed_frames = 0
  62.         while True:
  63.             ret, frame = cap.read()
  64.             if not ret:
  65.                 break
  66.                
  67.             # 去除水印
  68.             processed_frame = self._remove_watermark(frame)
  69.             
  70.             # 写入输出视频
  71.             out.write(processed_frame)
  72.             
  73.             # 显示进度
  74.             processed_frames += 1
  75.             if processed_frames % 100 == 0:
  76.                 print(f"已处理 {processed_frames}/{frame_count} 帧 ({processed_frames/frame_count*100:.1f}%)")
  77.                
  78.             # 调用进度回调函数
  79.             if self.progress_callback:
  80.                 self.progress_callback(processed_frames, frame_count)
  81.         
  82.         # 释放资源
  83.         cap.release()
  84.         out.release()
  85.         print(f"视频处理完成,已保存到: {self.output_path}")
  86.         return True
  87.    
  88.     def get_video_dimensions(self, cap):
  89.         """
  90.         获取视频尺寸
  91.         
  92.         参数:
  93.             cap: 视频捕获对象
  94.             
  95.         返回:
  96.             (width, height): 视频宽度和高度的元组
  97.         """
  98.         width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
  99.         height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
  100.         return (width, height)
  101.    
  102.     def _detect_watermark(self, cap):
  103.         """
  104.         尝试自动检测视频中的水印区域
  105.         
  106.         这里使用一个简单的方法:采样多个帧,找出帧之间变化较小的区域
  107.         优先检测右下角区域作为水印位置
  108.         """
  109.         # 采样帧数
  110.         sample_count = min(20, int(cap.get(cv2.CAP_PROP_FRAME_COUNT)))
  111.         if sample_count < 3:
  112.             return None
  113.             
  114.         # 获取视频尺寸
  115.         width, height = self.get_video_dimensions(cap)
  116.         
  117.         # 采样帧
  118.         frames = []
  119.         frame_indices = np.linspace(0, cap.get(cv2.CAP_PROP_FRAME_COUNT) - 1, sample_count, dtype=int)
  120.         
  121.         for idx in frame_indices:
  122.             cap.set(cv2.CAP_PROP_POS_FRAMES, idx)
  123.             ret, frame = cap.read()
  124.             if ret:
  125.                 # 转换为灰度图
  126.                 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  127.                 frames.append(gray)
  128.         
  129.         if len(frames) < 3:
  130.             return None
  131.             
  132.         # 计算帧之间的差异
  133.         diff_sum = np.zeros((height, width), dtype=np.float32)
  134.         
  135.         for i in range(len(frames) - 1):
  136.             diff = cv2.absdiff(frames[i], frames[i+1])
  137.             diff_sum += diff
  138.             
  139.         # 归一化差异图
  140.         if np.max(diff_sum) > 0:
  141.             diff_norm = diff_sum / np.max(diff_sum)
  142.             diff_norm = (1.0 - diff_norm) * 255
  143.             diff_norm = diff_norm.astype(np.uint8)
  144.             
  145.             # 二值化,找出变化较小的区域(可能是水印)
  146.             _, thresh = cv2.threshold(diff_norm, 240, 255, cv2.THRESH_BINARY)
  147.             
  148.             # 形态学操作,去除噪点
  149.             kernel = np.ones((5, 5), np.uint8)
  150.             thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
  151.             thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
  152.             
  153.             # 寻找轮廓
  154.             contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  155.             
  156.             # 筛选可能的水印区域(面积不太小,且位于图像边缘附近)
  157.             min_area = width * height * 0.005  # 最小面积阈值
  158.             max_area = width * height * 0.15   # 最大面积阈值
  159.             
  160.             # 优先检查右下角区域的轮廓
  161.             right_bottom_contours = []
  162.             other_contours = []
  163.             
  164.             for contour in contours:
  165.                 area = cv2.contourArea(contour)
  166.                 if min_area < area < max_area:
  167.                     x, y, w, h = cv2.boundingRect(contour)
  168.                     # 检查是否在右下角
  169.                     if x + w > width * 0.5 and y + h > height * 0.5:
  170.                         right_bottom_contours.append((x, y, w, h, area))
  171.                     # 检查是否靠近其他边缘
  172.                     elif (x < width * 0.1 or x + w > width * 0.9 or
  173.                           y < height * 0.1 or y + h > height * 0.9):
  174.                         other_contours.append((x, y, w, h, area))
  175.             
  176.             # 优先返回右下角区域,按面积排序
  177.             if right_bottom_contours:
  178.                 right_bottom_contours.sort(key=lambda c: c[4], reverse=True)
  179.                 return list(right_bottom_contours[0][:4])
  180.             
  181.             # 如果没有右下角区域,返回其他边缘区域
  182.             if other_contours:
  183.                 other_contours.sort(key=lambda c: c[4], reverse=True)
  184.                 return list(other_contours[0][:4])
  185.             
  186.             # 如果没有检测到合适的水印区域,返回默认的右下角区域
  187.             watermark_width = int(width * 0.2)  # 默认水印宽度为视频宽度的20%
  188.             watermark_height = int(height * 0.1)  # 默认水印高度为视频高度的10%
  189.             watermark_x = width - watermark_width - 10  # 右边距离10像素
  190.             watermark_y = height - watermark_height - 10  # 下边距离10像素
  191.             return [watermark_x, watermark_y, watermark_width, watermark_height]
  192.         
  193.         return None
  194.    
  195.     def _remove_watermark(self, frame):
  196.         """
  197.         从帧中去除水印
  198.         
  199.         这里使用了一个简单的方法:使用Inpainting算法填充水印区域
  200.         """
  201.         if self.watermark_region is None:
  202.             return frame
  203.             
  204.         # 创建掩码
  205.         mask = np.zeros(frame.shape[:2], dtype=np.uint8)
  206.         x, y, w, h = self.watermark_region
  207.         mask[y:y+h, x:x+w] = 255
  208.         
  209.         # 使用Inpainting算法填充水印区域
  210.         result = cv2.inpaint(frame, mask, 3, cv2.INPAINT_TELEA)
  211.         
  212.         return result


  213. def main():
  214.     # 解析命令行参数
  215.     parser = argparse.ArgumentParser(description='视频去水印工具')
  216.     parser.add_argument('input', help='输入视频文件路径')
  217.     parser.add_argument('output', help='输出视频文件路径')
  218.     parser.add_argument('--region', type=int, nargs=4, metavar=('X', 'Y', 'WIDTH', 'HEIGHT'),
  219.                         help='水印区域 [x y width height],如果不指定则尝试自动检测')
  220.    
  221.     args = parser.parse_args()
  222.    
  223.     # 检查输入文件是否存在
  224.     if not os.path.isfile(args.input):
  225.         print(f"错误: 输入文件不存在: {args.input}")
  226.         return
  227.         
  228.     # 检查输出目录是否存在
  229.     output_dir = os.path.dirname(args.output)
  230.     if output_dir and not os.path.exists(output_dir):
  231.         os.makedirs(output_dir)
  232.    
  233.     # 创建去水印器并处理
  234.     remover = VideoWatermarkRemover(args.input, args.output, args.region)
  235.     remover.process()


  236. if __name__ == "__main__":
  237.     main()
复制代码


不得不说AI真滴强,经过几次AI修改,生成代码完全能运行。

将两份代码放在同一个文件夹下,运行watermark_remover_gui.py,如图

26be4aa7485db0940a218dbe480e8848.png

选择要去水印的视频,自动检测水印的位置,但其实检测不到,后来让AI来修改,添加鼠标框选水印的位置,点击处理。

测试水印能够去除掉 ,AI太强大了!

最后用剪映添加到视频开头,加一点特效,好了,展示结果吧:


大家觉得这个视频怎么样?感觉有点意思

不得不说剪映蛮强的,缺点是画面要能都是动态视频分镜就好了,另外如果后续章节能保持人物一致性那就最好了 ,这样能出连续章节性漫画了。

还有里面说到的创作者分成,我是没找到 ,后面再看看,看来赚钱与我无缘,我的月入3w啊...............  。

评分

参与人数 2荣誉 +12 鱼币 +13 贡献 +13 C币 +11 收起 理由
小甲鱼 + 10 + 10 + 10 + 10 鱼C有你更精彩^_^
不二如是 + 2 + 3 + 3 + 1 视频非常精彩!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 29 分钟前 | 显示全部楼层
不错不错,待会来分享一下,值得大家学习~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层
牛!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2 小时前 | 显示全部楼层

使用者更牛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2 小时前 | 显示全部楼层

谢谢夸奖
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层

鱼C有你更精彩
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 14 分钟前 | 显示全部楼层
小甲鱼 发表于 2025-5-16 16:55
不错不错,待会来分享一下,值得大家学习~

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-16 17:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表