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?: {
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]

View File

@ -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");
}