diff --git a/src/tools/image.ts b/src/tools/image.ts index 4b15dac..d343d1b 100644 --- a/src/tools/image.ts +++ b/src/tools/image.ts @@ -692,11 +692,15 @@ export const imageEditTool = { if (!fs.existsSync(resolved)) return { success: false, error: `File not found: ${resolved}` }; // determine output path + // Default to PNG for lossy source formats to avoid cumulative compression loss. + // Only exception: 'convert' operation (user explicitly wants a format change). let outPath = String(args?.output || '').trim(); if (!outPath) { + const origExt = path.extname(resolved).toLowerCase(); + const lossyFmts = new Set(['.jpg', '.jpeg', '.webp']); const ext = args?.format ? `.${args.format}` - : (operation === 'convert' ? '.png' : path.extname(resolved)); + : (operation === 'convert' ? origExt : (lossyFmts.has(origExt) ? '.png' : origExt)); const base = path.basename(resolved, path.extname(resolved)); outPath = path.join(path.dirname(resolved), `${base}_${operation}_${Date.now()}${ext}`); } else if (!path.isAbsolute(outPath)) { @@ -718,7 +722,7 @@ export const imageEditTool = { text: args?.text ?? '', position: args?.position ?? 'bottom-right', opacity: args?.opacity ?? 0.5, - quality: args?.quality ?? 85, + quality: args?.quality ?? 92, style: args?.style ?? 'painting', };