From c79da3e1d086bb1a7910134b74ce74a1bf0cef2b Mon Sep 17 00:00:00 2001 From: 134 Date: Mon, 6 Jul 2026 03:41:56 +0800 Subject: [PATCH] fix: preserve single-channel scale adjust masks after blur --- app/api/canvas/local-edit/route.ts | 10 ++++++++++ lib/canvas/generate-image.ts | 2 ++ 2 files changed, 12 insertions(+) diff --git a/app/api/canvas/local-edit/route.ts b/app/api/canvas/local-edit/route.ts index 78ec735f9..dec126da7 100644 --- a/app/api/canvas/local-edit/route.ts +++ b/app/api/canvas/local-edit/route.ts @@ -2132,7 +2132,9 @@ async function buildScaleAdjustMaskWashPatch(params: { const alpha = await sharp(maskBuffer, { raw: { channels: 1, height: box.height, width: box.width }, }) + .greyscale() .blur(Math.max(1.2, Math.min(box.width, box.height) * 0.018)) + .greyscale() .raw() .toBuffer(); const rgba = Buffer.alloc(box.width * box.height * 4); @@ -2158,7 +2160,9 @@ async function buildScaleAdjustCompositeClipMaskPatch(params: { const alpha = await sharp(Buffer.from(maskBuffer), { raw: { channels: 1, height: box.height, width: box.width }, }) + .greyscale() .blur(Math.max(0.8, Math.min(box.width, box.height) * 0.006)) + .greyscale() .raw() .toBuffer(); const rgba = Buffer.alloc(box.width * box.height * 4); @@ -2183,7 +2187,9 @@ async function buildScaleAdjustOverlayClipMaskPatch(imageBuffer: Buffer) { const alpha = await sharp(imageBuffer, { failOn: "none" }) .ensureAlpha() .extractChannel(3) + .greyscale() .blur(Math.max(0.8, Math.min(width, height) * 0.006)) + .greyscale() .raw() .toBuffer(); const rgba = Buffer.alloc(width * height * 4); @@ -2297,7 +2303,9 @@ async function applyScaleAdjustAlphaMaskToRgba(params: { const softenedAlpha = await sharp(Buffer.from(alphaMask), { raw: { channels: 1, height, width }, }) + .greyscale() .blur(blur) + .greyscale() .raw() .toBuffer(); const output = Buffer.from(rawRgba); @@ -3184,7 +3192,9 @@ async function buildScaleAdjustStructureLockedComposite(params: { const subjectAlpha = await sharp(alphaMaskForSubject, { raw: { channels: 1, height: bbox.height, width: bbox.width }, }) + .greyscale() .blur(Math.max(0.7, Math.min(bbox.width, bbox.height) * 0.006)) + .greyscale() .png({ compressionLevel: 6 }) .toBuffer(); const widthFactor = diff --git a/lib/canvas/generate-image.ts b/lib/canvas/generate-image.ts index e56eab833..aca38923c 100644 --- a/lib/canvas/generate-image.ts +++ b/lib/canvas/generate-image.ts @@ -2314,7 +2314,9 @@ async function buildScaleAdjustFallbackObjectPng(params: { const alphaBuffer = await sharp(mask, { raw: { channels: 1, height: box.height, width: box.width }, }) + .greyscale() .blur(Math.max(0.7, Math.min(box.width, box.height) * 0.012)) + .greyscale() .png({ compressionLevel: 6 }) .toBuffer();