fix: avoid empty PSD replacement masks

This commit is contained in:
Your Name 2026-06-01 20:26:56 +08:00
parent 2f0c533b87
commit 154ec44a4c
2 changed files with 26 additions and 14 deletions

View File

@ -383,12 +383,21 @@ function buildPsdLayerPreviewUrl(
params?: { params?: {
width?: number; width?: number;
quality?: number; quality?: number;
delivery?: "proxy";
} }
) { ) {
return buildTemplatePreviewThumbUrl(imageUrl, { const width = Math.max(96, Math.min(1280, Math.round(params?.width || 720)));
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)));
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) { function buildPsdLayerMaskUrl(maskUrl: string, layerWidth: number) {
@ -1494,9 +1503,10 @@ function getAssignedImageMaskStyle(
const clipMaskLayer = layer.clipMaskLayerId const clipMaskLayer = layer.clipMaskLayerId
? layers.find((item) => item.id === layer.clipMaskLayerId) ? layers.find((item) => item.id === layer.clipMaskLayerId)
: null; : null;
const fallbackMaskUrl = layer.forceClipMask const fallbackMaskUrl =
? getPsdLayerPreviewSourceUrl(clipMaskLayer || layer) layer.forceClipMask && clipMaskLayer
: ""; ? getPsdLayerPreviewSourceUrl(clipMaskLayer)
: "";
const normalizedMaskUrl = String( const normalizedMaskUrl = String(
layer.maskUrl || fallbackMaskUrl || "" layer.maskUrl || fallbackMaskUrl || ""
).trim(); ).trim();
@ -4247,6 +4257,7 @@ export function AgentPsdTemplateEditorDialog({
? Math.max(layer.width, layer.height) ? Math.max(layer.width, layer.height)
: layer.width, : layer.width,
quality: assignedUrl ? 74 : 68, quality: assignedUrl ? 74 : 68,
delivery: assignedUrl ? "proxy" : undefined,
})} })}
style={ style={
assignedUrl && imageSizes[layer.id] assignedUrl && imageSizes[layer.id]

View File

@ -1001,7 +1001,12 @@ export async function renderAgentPsdTemplate(params: {
} }
const layerPositionOffset = getLayerPositionOffset(layer.id); 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) { if (isDefaultSourceImageLayer) {
await appendRenderBaseOverlay(); await appendRenderBaseOverlay();
} }
@ -1039,15 +1044,11 @@ export async function renderAgentPsdTemplate(params: {
.png(PSD_RENDER_PNG_OPTIONS) .png(PSD_RENDER_PNG_OPTIONS)
.toBuffer(); .toBuffer();
const shouldUseLayerSourceAsMask = !layer.maskUrl && layer.forceClipMask; if (shouldApplyMask) {
if (layer.maskUrl || shouldUseLayerSourceAsMask) {
try { try {
const clipMaskLayer = layer.clipMaskLayerId
? layerMap.get(layer.clipMaskLayerId)
: null;
const rawMaskBuffer = layer.maskUrl const rawMaskBuffer = layer.maskUrl
? await readCachedBuffer(layer.maskUrl, "PSD 蒙版资源") ? await readCachedBuffer(layer.maskUrl, "PSD 蒙版资源")
: await readReusableLayerBuffer(clipMaskLayer || layer); : await readReusableLayerBuffer(clipMaskLayer!);
if (!rawMaskBuffer) { if (!rawMaskBuffer) {
throw new Error("Missing PSD layer mask source"); throw new Error("Missing PSD layer mask source");
} }