diff --git a/components/canvas/CanvasChatPanel.tsx b/components/canvas/CanvasChatPanel.tsx index 1ea191e..5290b2a 100644 --- a/components/canvas/CanvasChatPanel.tsx +++ b/components/canvas/CanvasChatPanel.tsx @@ -58,15 +58,22 @@ interface CanvasChatPanelProps { // 建议卡片数据 - 已移除 const SUGGESTIONS: { title: string; desc: string; image: string }[] = []; -// 获取图片的原始尺寸 -function getImageDimensions(url: string): Promise<{ width: number; height: number }> { +// 获取图片尺寸(保留原图分辨率 + 画布显示尺寸) +function getImageDimensions(url: string): Promise<{ + width: number; + height: number; + originalWidth: number; + originalHeight: number; +}> { return new Promise((resolve) => { const img = new Image(); img.onload = () => { // 限制最大尺寸,避免节点过大 const maxSize = 500; - let width = img.naturalWidth; - let height = img.naturalHeight; + const originalWidth = img.naturalWidth; + const originalHeight = img.naturalHeight; + let width = originalWidth; + let height = originalHeight; // 如果图片太大,按比例缩小 if (width > maxSize || height > maxSize) { @@ -83,11 +90,11 @@ function getImageDimensions(url: string): Promise<{ width: number; height: numbe height = Math.round(height * scale); } - resolve({ width, height }); + resolve({ width, height, originalWidth, originalHeight }); }; img.onerror = () => { // 加载失败时使用默认尺寸 - resolve({ width: 300, height: 300 }); + resolve({ width: 300, height: 300, originalWidth: 0, originalHeight: 0 }); }; img.src = url; }); @@ -682,6 +689,10 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF src: url, status: 'completed', prompt: '对话生成', + metadata: { + originalWidth: dimensions.originalWidth, + originalHeight: dimensions.originalHeight, + }, }, connections: [], }); @@ -812,9 +823,15 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF : `用户未选中图片,默认使用最近 ${contextNodes.length} 张`, ...contextNodes.map((node, index) => { const label = positionLabel(node); - const size = node.size ? `${Math.round(node.size.width)}x${Math.round(node.size.height)}` : "未知尺寸"; + const metadata = (node.data as any)?.metadata; + const originalWidth = Number(metadata?.originalWidth || 0); + const originalHeight = Number(metadata?.originalHeight || 0); + const originalSize = + originalWidth > 0 && originalHeight > 0 + ? `,原图分辨率 ${Math.round(originalWidth)}x${Math.round(originalHeight)}` + : ""; const prompt = (node.data as any)?.prompt; - return `图片${index + 1}: ${label},尺寸 ${size}${prompt ? `,描述:${String(prompt).slice(0, 60)}` : ""}`; + return `图片${index + 1}: ${label}${originalSize}${prompt ? `,描述:${String(prompt).slice(0, 60)}` : ""}`; }), "若用户提到左/右/上/下/中等方位,请匹配对应位置的图片。", ]; @@ -1001,6 +1018,10 @@ export function CanvasChatPanel({ chatId, initialMessages = [], onClose, onOpenF status: 'completed', title: file.name.replace(/\.[^.]+$/, ""), prompt: file.name.replace(/\.[^.]+$/, ""), + metadata: { + originalWidth: dimensions.originalWidth, + originalHeight: dimensions.originalHeight, + }, }, connections: [], }); diff --git a/components/canvas/CanvasWorkspace.tsx b/components/canvas/CanvasWorkspace.tsx index dfa31a8..8847378 100644 --- a/components/canvas/CanvasWorkspace.tsx +++ b/components/canvas/CanvasWorkspace.tsx @@ -295,14 +295,21 @@ export function CanvasWorkspace() { setViewport({ x: newX, y: newY, zoom: newZoom }); }, [isMacPlatform, setViewport, viewport.x, viewport.y, viewport.zoom]); - const getImageDimensionsFromFile = useCallback((file: File): Promise<{ width: number; height: number }> => { + const getImageDimensionsFromFile = useCallback((file: File): Promise<{ + width: number; + height: number; + originalWidth: number; + originalHeight: number; + }> => { return new Promise((resolve) => { const url = URL.createObjectURL(file); const img = new Image(); img.onload = () => { const maxSize = 500; - let width = img.naturalWidth; - let height = img.naturalHeight; + const originalWidth = img.naturalWidth; + const originalHeight = img.naturalHeight; + let width = originalWidth; + let height = originalHeight; if (width > maxSize || height > maxSize) { const scale = Math.min(maxSize / width, maxSize / height); width = Math.round(width * scale); @@ -315,11 +322,11 @@ export function CanvasWorkspace() { height = Math.round(height * scale); } URL.revokeObjectURL(url); - resolve({ width, height }); + resolve({ width, height, originalWidth, originalHeight }); }; img.onerror = () => { URL.revokeObjectURL(url); - resolve({ width: 300, height: 300 }); + resolve({ width: 300, height: 300, originalWidth: 0, originalHeight: 0 }); }; img.src = url; }); @@ -352,6 +359,10 @@ export function CanvasWorkspace() { status: "generating", prompt: cleanName || "拖拽上传", title: cleanName || "拖拽上传", + metadata: { + originalWidth: dimensions.originalWidth, + originalHeight: dimensions.originalHeight, + }, }, connections: [], }); @@ -365,6 +376,10 @@ export function CanvasWorkspace() { status: "completed", prompt: cleanName || "拖拽上传", title: cleanName || "拖拽上传", + metadata: { + originalWidth: dimensions.originalWidth, + originalHeight: dimensions.originalHeight, + }, }, }); toast.success("图片已添加到画布"); diff --git a/lib/ai/auto-agent-graph.ts b/lib/ai/auto-agent-graph.ts index 595fb74..002184e 100644 --- a/lib/ai/auto-agent-graph.ts +++ b/lib/ai/auto-agent-graph.ts @@ -139,7 +139,8 @@ async function generateAgentConversation( - ### 图片分析 - ### 执行计划 - ### 输出设置 -6) “图片分析”要结合每张参考图差异,给出风格/构图/材质/光影等具体观察。`; +6) “图片分析”要结合每张参考图差异,给出风格/构图/材质/光影等具体观察。 +7) 只有明确拿到“原图分辨率”时,才能写具体像素尺寸;否则只写宽高比/清晰度目标,不要编造 335x500 这类预览尺寸。`; const prompt = [ `【用户原始需求】${state.text || "(无文本)"}`,