feat(core): add quality parameter for image compression control

This commit is contained in:
2025-08-02 17:17:52 +00:00
parent 764b074ca4
commit 2eb887dce7
4 changed files with 94 additions and 19 deletions

View File

@@ -7,6 +7,7 @@ export interface IAssetVariation {
height?: number;
invert?: boolean;
progressive?: boolean;
quality?: number;
}
export interface ISmartJimpOptions {
@@ -72,24 +73,44 @@ export class SmartJimp {
}
switch (assetVariationArg.format) {
case 'avif':
sharpImage = resultResize.avif();
const avifOptions: any = {};
if (assetVariationArg.quality !== undefined) {
avifOptions.quality = assetVariationArg.quality;
}
sharpImage = resultResize.avif(avifOptions);
break;
case 'webp':
sharpImage = resultResize.webp();
const webpOptions: any = {};
if (assetVariationArg.quality !== undefined) {
webpOptions.quality = assetVariationArg.quality;
}
sharpImage = resultResize.webp(webpOptions);
break;
case 'png':
sharpImage = resultResize.png();
const pngOptions: any = {};
if (assetVariationArg.quality !== undefined) {
pngOptions.quality = assetVariationArg.quality;
}
sharpImage = resultResize.png(pngOptions);
break;
case 'jpeg':
sharpImage = resultResize.jpeg({
const jpegOptions: any = {
progressive: assetVariationArg.progressive || false
});
};
if (assetVariationArg.quality !== undefined) {
jpegOptions.quality = assetVariationArg.quality;
}
sharpImage = resultResize.jpeg(jpegOptions);
break;
default:
// Default to JPEG
sharpImage = resultResize.jpeg({
const defaultJpegOptions: any = {
progressive: assetVariationArg.progressive || false
});
};
if (assetVariationArg.quality !== undefined) {
defaultJpegOptions.quality = assetVariationArg.quality;
}
sharpImage = resultResize.jpeg(defaultJpegOptions);
}
return sharpImage.toBuffer();
} else if (this.options.mode === 'jimp') {
@@ -106,20 +127,22 @@ export class SmartJimp {
}
// Note: Jimp does not support progressive JPEG encoding
// Progressive option is ignored in jimp mode
const jpegOptions: any = {};
if (assetVariationArg.quality !== undefined) {
jpegOptions.quality = assetVariationArg.quality;
}
switch (assetVariationArg.format) {
case 'png':
return await jimpImage.getBuffer("image/png");
case 'jpeg':
return await jimpImage.getBuffer("image/jpeg");
case 'webp':
// Jimp doesn't support WebP, fallback to JPEG
return await jimpImage.getBuffer("image/jpeg");
case 'avif':
// Jimp doesn't support AVIF, fallback to JPEG
return await jimpImage.getBuffer("image/jpeg");
console.log(`Jimp doesn't support ${assetVariationArg.format}, falling back to JPEG`);
// Fall through to JPEG
case 'jpeg':
default:
// Default to JPEG
return await jimpImage.getBuffer("image/jpeg");
return await jimpImage.getBuffer("image/jpeg", jpegOptions);
}
}
}