mirror of
https://github.com/danny-avila/LibreChat.git
synced 2025-12-18 01:10:14 +01:00
52 lines
1.9 KiB
JavaScript
52 lines
1.9 KiB
JavaScript
const sharp = require('sharp');
|
|
|
|
async function resizeImage(inputFilePath, resolution) {
|
|
const maxLowRes = 512;
|
|
const maxShortSideHighRes = 768;
|
|
const maxLongSideHighRes = 2000;
|
|
|
|
let newWidth, newHeight;
|
|
let resizeOptions = { fit: 'inside', withoutEnlargement: true };
|
|
|
|
if (resolution === 'low') {
|
|
resizeOptions.width = maxLowRes;
|
|
resizeOptions.height = maxLowRes;
|
|
} else if (resolution === 'high') {
|
|
const metadata = await sharp(inputFilePath).metadata();
|
|
const isWidthShorter = metadata.width < metadata.height;
|
|
|
|
if (isWidthShorter) {
|
|
// Width is the shorter side
|
|
newWidth = Math.min(metadata.width, maxShortSideHighRes);
|
|
// Calculate new height to maintain aspect ratio
|
|
newHeight = Math.round((metadata.height / metadata.width) * newWidth);
|
|
// Ensure the long side does not exceed the maximum allowed
|
|
if (newHeight > maxLongSideHighRes) {
|
|
newHeight = maxLongSideHighRes;
|
|
newWidth = Math.round((metadata.width / metadata.height) * newHeight);
|
|
}
|
|
} else {
|
|
// Height is the shorter side
|
|
newHeight = Math.min(metadata.height, maxShortSideHighRes);
|
|
// Calculate new width to maintain aspect ratio
|
|
newWidth = Math.round((metadata.width / metadata.height) * newHeight);
|
|
// Ensure the long side does not exceed the maximum allowed
|
|
if (newWidth > maxLongSideHighRes) {
|
|
newWidth = maxLongSideHighRes;
|
|
newHeight = Math.round((metadata.height / metadata.width) * newWidth);
|
|
}
|
|
}
|
|
|
|
resizeOptions.width = newWidth;
|
|
resizeOptions.height = newHeight;
|
|
} else {
|
|
throw new Error('Invalid resolution parameter');
|
|
}
|
|
|
|
const resizedBuffer = await sharp(inputFilePath).rotate().resize(resizeOptions).toBuffer();
|
|
|
|
const resizedMetadata = await sharp(resizedBuffer).metadata();
|
|
return { buffer: resizedBuffer, width: resizedMetadata.width, height: resizedMetadata.height };
|
|
}
|
|
|
|
module.exports = { resizeImage };
|