From 154ec44a4cfa78b5267da96d580feb5cdc4af293 Mon Sep 17 00:00:00 2001 From: Your Name Date: Mon, 1 Jun 2026 20:26:56 +0800 Subject: [PATCH] fix: avoid empty PSD replacement masks --- .../agents/AgentPsdTemplateEditorDialog.tsx | 25 +++++++++++++------ lib/agents/psd-template-renderer.ts | 15 +++++------ 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/components/agents/AgentPsdTemplateEditorDialog.tsx b/components/agents/AgentPsdTemplateEditorDialog.tsx index bb9e4dd28..3b3809ffe 100644 --- a/components/agents/AgentPsdTemplateEditorDialog.tsx +++ b/components/agents/AgentPsdTemplateEditorDialog.tsx @@ -383,12 +383,21 @@ function buildPsdLayerPreviewUrl( params?: { width?: number; quality?: number; + delivery?: "proxy"; } ) { - return buildTemplatePreviewThumbUrl(imageUrl, { - width: Math.max(96, Math.min(1280, Math.round(params?.width || 720))), - quality: Math.max(52, Math.min(82, Math.round(params?.quality || 68))), - }); + const width = Math.max(96, Math.min(1280, Math.round(params?.width || 720))); + const quality = Math.max(52, Math.min(82, Math.round(params?.quality || 68))); + if (params?.delivery === "proxy") { + return buildImageProxyUrl(imageUrl, { + width, + quality, + format: "webp", + delivery: "proxy", + }); + } + + return buildTemplatePreviewThumbUrl(imageUrl, { width, quality }); } function buildPsdLayerMaskUrl(maskUrl: string, layerWidth: number) { @@ -1494,9 +1503,10 @@ function getAssignedImageMaskStyle( const clipMaskLayer = layer.clipMaskLayerId ? layers.find((item) => item.id === layer.clipMaskLayerId) : null; - const fallbackMaskUrl = layer.forceClipMask - ? getPsdLayerPreviewSourceUrl(clipMaskLayer || layer) - : ""; + const fallbackMaskUrl = + layer.forceClipMask && clipMaskLayer + ? getPsdLayerPreviewSourceUrl(clipMaskLayer) + : ""; const normalizedMaskUrl = String( layer.maskUrl || fallbackMaskUrl || "" ).trim(); @@ -4247,6 +4257,7 @@ export function AgentPsdTemplateEditorDialog({ ? Math.max(layer.width, layer.height) : layer.width, quality: assignedUrl ? 74 : 68, + delivery: assignedUrl ? "proxy" : undefined, })} style={ assignedUrl && imageSizes[layer.id] diff --git a/lib/agents/psd-template-renderer.ts b/lib/agents/psd-template-renderer.ts index da9df60ed..fd764a476 100644 --- a/lib/agents/psd-template-renderer.ts +++ b/lib/agents/psd-template-renderer.ts @@ -1001,7 +1001,12 @@ export async function renderAgentPsdTemplate(params: { } const layerPositionOffset = getLayerPositionOffset(layer.id); - if (!layer.maskUrl && !layer.forceClipMask) { + const clipMaskLayer = + layer.forceClipMask && layer.clipMaskLayerId + ? layerMap.get(layer.clipMaskLayerId) + : null; + const shouldApplyMask = Boolean(layer.maskUrl || clipMaskLayer); + if (!shouldApplyMask) { if (isDefaultSourceImageLayer) { await appendRenderBaseOverlay(); } @@ -1039,15 +1044,11 @@ export async function renderAgentPsdTemplate(params: { .png(PSD_RENDER_PNG_OPTIONS) .toBuffer(); - const shouldUseLayerSourceAsMask = !layer.maskUrl && layer.forceClipMask; - if (layer.maskUrl || shouldUseLayerSourceAsMask) { + if (shouldApplyMask) { try { - const clipMaskLayer = layer.clipMaskLayerId - ? layerMap.get(layer.clipMaskLayerId) - : null; const rawMaskBuffer = layer.maskUrl ? await readCachedBuffer(layer.maskUrl, "PSD 蒙版资源") - : await readReusableLayerBuffer(clipMaskLayer || layer); + : await readReusableLayerBuffer(clipMaskLayer!); if (!rawMaskBuffer) { throw new Error("Missing PSD layer mask source"); }