From 1fd22329a8280a1ab03411cad33455a8d5adbc2d Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Tue, 28 Jul 2026 14:19:37 +0800 Subject: [PATCH] refactor: split GreenScreenPanel into green-screen sub-components Extract color presets, custom color picker, parameter sliders, and preview into separate components. Main file reduces from 200 to 94 lines (-53%). - GreenScreenPresets: 5 color preset buttons - GreenScreenCustomColor: color picker + hex input + swatch - GreenScreenSliders: similarity / blend / spill sliders (with SliderRow) - GreenScreenPreview: visual effect preview --- .../components/GreenScreenPanel.tsx | 151 +++--------------- .../green-screen/GreenScreenCustomColor.tsx | 37 +++++ .../green-screen/GreenScreenPresets.tsx | 36 +++++ .../green-screen/GreenScreenPreview.tsx | 28 ++++ .../green-screen/GreenScreenSliders.tsx | 68 ++++++++ 5 files changed, 190 insertions(+), 130 deletions(-) mode change 100644 => 100755 apps/web/src/pages/editing-planner/components/GreenScreenPanel.tsx create mode 100755 apps/web/src/pages/editing-planner/components/green-screen/GreenScreenCustomColor.tsx create mode 100755 apps/web/src/pages/editing-planner/components/green-screen/GreenScreenPresets.tsx create mode 100755 apps/web/src/pages/editing-planner/components/green-screen/GreenScreenPreview.tsx create mode 100755 apps/web/src/pages/editing-planner/components/green-screen/GreenScreenSliders.tsx diff --git a/apps/web/src/pages/editing-planner/components/GreenScreenPanel.tsx b/apps/web/src/pages/editing-planner/components/GreenScreenPanel.tsx old mode 100644 new mode 100755 index ffab70927..25caa2d83 --- a/apps/web/src/pages/editing-planner/components/GreenScreenPanel.tsx +++ b/apps/web/src/pages/editing-planner/components/GreenScreenPanel.tsx @@ -1,15 +1,11 @@ -/** - * 绿幕抠像配置面板 - * 5 种颜色预设 + 自定义颜色 + 相似度/边缘平滑/溢色抑制 - */ import React, { useCallback } from "react" import { Drawer, Switch } from "antd" import type { ChromaKeyConfig, ChromaKeyColorPreset } from "../types" -import { - DEFAULT_CHROMA_KEY_CONFIG, - CHROMA_KEY_PRESET_LABELS, - CHROMA_KEY_PRESET_COLORS, -} from "../types" +import { DEFAULT_CHROMA_KEY_CONFIG, CHROMA_KEY_PRESET_COLORS } from "../types" +import { GreenScreenPresets } from "./green-screen/GreenScreenPresets" +import { GreenScreenCustomColor } from "./green-screen/GreenScreenCustomColor" +import { GreenScreenSliders } from "./green-screen/GreenScreenSliders" +import { GreenScreenPreview } from "./green-screen/GreenScreenPreview" interface GreenScreenPanelProps { open: boolean @@ -18,9 +14,6 @@ interface GreenScreenPanelProps { onChange: (config: ChromaKeyConfig) => void } -/** 预设列表 */ -const PRESET_LIST: ChromaKeyColorPreset[] = ["green", "blue", "red", "pure_green", "soft_green"] - const GreenScreenPanel: React.FC = ({ open, onClose, config, onChange }) => { const update = useCallback( (partial: Partial) => { @@ -33,7 +26,6 @@ const GreenScreenPanel: React.FC = ({ open, onClose, conf onChange({ ...DEFAULT_CHROMA_KEY_CONFIG, enabled: config.enabled }) }, [config.enabled, onChange]) - /** 选择颜色预设时同步更新 color 字段 */ const handlePresetSelect = useCallback( (preset: ChromaKeyColorPreset) => { update({ @@ -44,10 +36,9 @@ const GreenScreenPanel: React.FC = ({ open, onClose, conf [update], ) - /** 自定义颜色变化时清除预设标记 */ const handleColorChange = useCallback( - (e: React.ChangeEvent) => { - update({ color: e.target.value }) + (color: string) => { + update({ color }) }, [update], ) @@ -61,7 +52,6 @@ const GreenScreenPanel: React.FC = ({ open, onClose, conf onClose={onClose} className="green-screen-panel-drawer" > - {/* 顶部开关 */}
启用绿幕抠像 = ({ open, onClose, conf />
- {/* 颜色预设 */} -
-
颜色预设
-
- {PRESET_LIST.map((p) => ( - - ))} -
-
+ - {/* 自定义颜色 */} -
-
自定义颜色
-
- - -
-
-
+ - {/* 参数调节 */} -
-
参数调节
+ update({ similarity: v })} + onBlendChange={(v) => update({ blend: v })} + onSpillChange={(v) => update({ spill: v })} + /> - {/* 相似度 */} -
-
- 相似度 - {config.similarity}% -
- update({ similarity: Number(e.target.value) })} - /> -
越大容忍的色差范围越广
-
+ - {/* 边缘平滑 */} -
-
- 边缘平滑 - {config.blend}% -
- update({ blend: Number(e.target.value) })} - /> -
越大边缘越柔和自然
-
- - {/* 溢色抑制 */} -
-
- 溢色抑制 - {config.spill}% -
- update({ spill: Number(e.target.value) })} - /> -
去除边缘颜色溢出
-
-
- - {/* 预览 */} -
-
效果预览
-
-
-
-
-
主体
-
-
-
-
- - {/* 底部重置 */}
+ ))} +
+
+ ) +} diff --git a/apps/web/src/pages/editing-planner/components/green-screen/GreenScreenPreview.tsx b/apps/web/src/pages/editing-planner/components/green-screen/GreenScreenPreview.tsx new file mode 100755 index 000000000..05d0c72f6 --- /dev/null +++ b/apps/web/src/pages/editing-planner/components/green-screen/GreenScreenPreview.tsx @@ -0,0 +1,28 @@ +import React from "react" + +interface GreenScreenPreviewProps { + color: string + blend: number +} + +export const GreenScreenPreview: React.FC = ({ color, blend }) => { + return ( +
+
效果预览
+
+
+
+
+
主体
+
+
+
+
+ ) +} diff --git a/apps/web/src/pages/editing-planner/components/green-screen/GreenScreenSliders.tsx b/apps/web/src/pages/editing-planner/components/green-screen/GreenScreenSliders.tsx new file mode 100755 index 000000000..044776f2a --- /dev/null +++ b/apps/web/src/pages/editing-planner/components/green-screen/GreenScreenSliders.tsx @@ -0,0 +1,68 @@ +import React from "react" + +interface SliderConfig { + label: string + value: number + description: string + onChange: (value: number) => void +} + +interface GreenScreenSlidersProps { + similarity: number + blend: number + spill: number + onSimilarityChange: (value: number) => void + onBlendChange: (value: number) => void + onSpillChange: (value: number) => void +} + +const SliderRow: React.FC = ({ label, value, description, onChange }) => ( +
+
+ {label} + {value}% +
+ onChange(Number(e.target.value))} + /> +
{description}
+
+) + +export const GreenScreenSliders: React.FC = ({ + similarity, + blend, + spill, + onSimilarityChange, + onBlendChange, + onSpillChange, +}) => { + return ( +
+
参数调节
+ + + +
+ ) +} -- 2.54.0