feat(core): add quality parameter for image compression control
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user