From 433013673c5162d65ce7f0661141d130f47bda88 Mon Sep 17 00:00:00 2001 From: yun Date: Thu, 9 Jul 2026 11:18:43 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=86=E9=A2=91=20=E6=88=AA=E5=8F=96?= =?UTF-8?q?=E5=B8=A7=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../composer/NodeHighDefinitionPanel.tsx | 89 +++- src/components/media/CustomVideoPlayer.tsx | 478 ++++++++++++++++++ src/components/nodes/GenerateVideoNode.tsx | 54 +- src/components/nodes/VideoInputNode.tsx | 131 ++--- .../__tests__/derivedImageExecutor.test.ts | 44 +- .../__tests__/nanoBananaExecutor.test.ts | 4 + src/store/execution/derivedImageExecutor.ts | 13 +- src/types/nodes.ts | 2 +- .../__tests__/highDefinitionNodes.test.ts | 2 + src/utils/highDefinitionNodes.ts | 4 + src/utils/smartImageMode.ts | 6 +- src/utils/videoFrameCapture.ts | 113 +++++ src/utils/videoFrameNode.ts | 52 ++ 13 files changed, 843 insertions(+), 149 deletions(-) create mode 100644 src/components/media/CustomVideoPlayer.tsx create mode 100644 src/utils/videoFrameCapture.ts create mode 100644 src/utils/videoFrameNode.ts diff --git a/src/components/composer/NodeHighDefinitionPanel.tsx b/src/components/composer/NodeHighDefinitionPanel.tsx index dbba416e..eddc70d2 100644 --- a/src/components/composer/NodeHighDefinitionPanel.tsx +++ b/src/components/composer/NodeHighDefinitionPanel.tsx @@ -2,24 +2,34 @@ import { useCallback, useMemo } from "react"; import { Button, Select } from "antd"; -import { ArrowUpOutlined } from "@ant-design/icons"; +import { ArrowUpOutlined, ThunderboltFilled } from "@ant-design/icons"; import { PopiModelSelect } from "@/components/nodes/PopiModelSelect"; import { useModelStore } from "@/store/modelStore"; import { useWorkflowStore } from "@/store/workflowStore"; import type { SmartImageNodeData, WorkflowNode } from "@/types"; -import { buildHighDefinitionParameters, chooseHighDefinitionModel, HIGH_DEFINITION_BATCH_SIZE, HIGH_DEFINITION_RESOLUTION, HIGH_DEFINITION_SUBTYPE } from "@/utils/highDefinitionNodes"; +import { buildHighDefinitionParameters, chooseHighDefinitionModel, HIGH_DEFINITION_BATCH_SIZE, HIGH_DEFINITION_MODEL_MODE, HIGH_DEFINITION_SCALE, HIGH_DEFINITION_SUBTYPE } from "@/utils/highDefinitionNodes"; import { toSelectedModel } from "@/utils/selectedModel"; interface NodeHighDefinitionPanelProps { node: WorkflowNode; } -const RESOLUTION_OPTIONS = [ - { label: "4K", value: "4K" }, +const SCALE_OPTIONS = [ + { label: "2", value: 2 }, + { label: "4", value: 4 }, + { label: "6", value: 6 }, ]; -function readResolution(parameters: Record | undefined): string { - return typeof parameters?.resolution === "string" && parameters.resolution ? parameters.resolution : HIGH_DEFINITION_RESOLUTION; +const MODEL_MODE_OPTIONS = [ + { label: "通用", value: HIGH_DEFINITION_MODEL_MODE }, +]; + +function readScale(parameters: Record | undefined): number { + return typeof parameters?.scale === "number" && Number.isFinite(parameters.scale) ? parameters.scale : HIGH_DEFINITION_SCALE; +} + +function readModelMode(parameters: Record | undefined): string { + return typeof parameters?.modelMode === "string" && parameters.modelMode ? parameters.modelMode : HIGH_DEFINITION_MODEL_MODE; } export function NodeHighDefinitionPanel({ node }: NodeHighDefinitionPanelProps) { @@ -33,7 +43,8 @@ export function NodeHighDefinitionPanel({ node }: NodeHighDefinitionPanelProps) [data.selectedModel, highDefinitionModels] ); const parameters = buildHighDefinitionParameters(data.parameters); - const resolution = readResolution(parameters); + const scale = readScale(parameters); + const modelMode = readModelMode(parameters); const updateParameters = useCallback((patch: Record) => { updateNodeData(node.id, { @@ -61,24 +72,15 @@ export function NodeHighDefinitionPanel({ node }: NodeHighDefinitionPanelProps)
event.stopPropagation()} > -
-
-

高清放大

-
- + ))} +
+ ), [handleCaptureFrame, hasLoadedFrame, isCaptureLoading, isRunning]); + + return ( +
setIsHovered(true)} + onMouseLeave={() => setIsHovered(false)} + onDoubleClickCapture={preventVideoDoubleClick} + onDoubleClick={preventVideoDoubleClick} + > +