diff --git a/src/v1/routes/pimage.js b/src/v1/routes/pimage.js index 1822862..5212194 100644 --- a/src/v1/routes/pimage.js +++ b/src/v1/routes/pimage.js @@ -110,40 +110,36 @@ export async function handlePimage(req, res) { return res.status(304).end(); } - let buffer = image.buffer; - let contentType = 'image/jpeg'; + const imageSharp = sharp(image.buffer); + const meta = await imageSharp.metadata(); - try { - const imageSharp = sharp(buffer); - const meta = await imageSharp.metadata(); - - let pipeline = imageSharp.resize(targetW, targetH, { + let pipeline = imageSharp + .resize(targetW, targetH, { fit: 'inside', withoutEnlargement: true, - }); + }) + .flatten({ background: '#ffffff' }); - const accept = String(req.headers.accept || ''); - const formatParam = typeof req.query.format === 'string' ? req.query.format.toLowerCase() : ''; + const accept = String(req.headers.accept || ''); + const formatParam = typeof req.query.format === 'string' ? req.query.format.toLowerCase() : ''; - if (formatParam === 'avif' || (!formatParam && accept.includes('image/avif'))) { - pipeline = pipeline.avif({ effort: 2 }); - contentType = 'image/avif'; - } else if (formatParam === 'webp' || (!formatParam && accept.includes('image/webp'))) { - pipeline = pipeline.webp({ quality: 85 }); - contentType = 'image/webp'; - } else if (formatParam === 'png' || (!formatParam && meta.hasAlpha)) { - pipeline = pipeline.png(); - contentType = 'image/png'; - } else { - pipeline = pipeline.jpeg({ quality: 85 }); - contentType = 'image/jpeg'; - } - - buffer = await pipeline.toBuffer(); - } catch (resizeErr) { - console.warn(`[pimage] resize/convert fallback for ${rawPath}:`, resizeErr.message); + let contentType = 'image/jpeg'; + if (formatParam === 'avif' || (!formatParam && accept.includes('image/avif'))) { + pipeline = pipeline.avif({ effort: 2 }); + contentType = 'image/avif'; + } else if (formatParam === 'webp' || (!formatParam && accept.includes('image/webp'))) { + pipeline = pipeline.webp({ quality: 85 }); + contentType = 'image/webp'; + } else if (formatParam === 'png' || (!formatParam && meta.hasAlpha)) { + pipeline = pipeline.png(); + contentType = 'image/png'; + } else { + pipeline = pipeline.jpeg({ quality: 85 }); + contentType = 'image/jpeg'; } + const buffer = await pipeline.toBuffer(); + res.setHeader('Content-Type', contentType); res.setHeader('Content-Length', String(buffer.length)); res.setHeader('Cache-Control', 'public, max-age=86400');