add size parameter

This commit is contained in:
Abhinav 2023-01-05 10:53:57 +05:30
parent 9fea5e4149
commit d8c69c5acc
3 changed files with 51 additions and 19 deletions

View file

@ -13,7 +13,8 @@ export async function convertHEIC(fileData: Uint8Array): Promise<Uint8Array> {
export async function generateImageThumbnail(
inputFile: File | ElectronFile,
maxDimension: number
maxDimension: number,
maxSize: number
): Promise<Uint8Array> {
let inputFilePath = null;
let createdTempInputFile = null;
@ -32,7 +33,8 @@ export async function generateImageThumbnail(
const thumbnail = await ipcRenderer.invoke(
'generate-image-thumbnail',
inputFilePath,
maxDimension
maxDimension,
maxSize
);
return thumbnail;
} finally {

View file

@ -18,6 +18,10 @@ const MAX_DIMENSION_PLACEHOLDER = 'MAX_DIMENSION';
const SAMPLE_SIZE_PLACEHOLDER = 'SAMPLE_SIZE';
const INPUT_PATH_PLACEHOLDER = 'INPUT';
const OUTPUT_PATH_PLACEHOLDER = 'OUTPUT';
const QUALITY_PLACEHOLDER = 'QUALITY';
const MAX_QUALITY = 80;
const MIN_QUALITY = 50;
const SIPS_HEIC_CONVERT_COMMAND_TEMPLATE = [
'sips',
@ -56,6 +60,10 @@ const IMAGE_MAGICK_THUMBNAIL_GENERATE_COMMAND_TEMPLATE = [
INPUT_PATH_PLACEHOLDER,
'-thumbnail',
`${MAX_DIMENSION_PLACEHOLDER}x${MAX_DIMENSION_PLACEHOLDER}>`,
'-unsharp',
'0x.5',
'-quality',
QUALITY_PLACEHOLDER,
OUTPUT_PATH_PLACEHOLDER,
];
@ -153,22 +161,35 @@ function constructConvertCommand(
export async function generateImageThumbnail(
inputFilePath: string,
width: number
width: number,
maxSize: number
): Promise<Uint8Array> {
let tempOutputFilePath: string;
let quality = MAX_QUALITY;
try {
tempOutputFilePath = await generateTempFilePath('thumb.jpeg');
let thumbnail: Uint8Array;
do {
console.log(
'generating thumbnail',
'quality',
quality,
'thumbnail',
thumbnail?.length
);
await runThumbnailGenerationCommand(
inputFilePath,
tempOutputFilePath,
width,
quality
);
await runThumbnailGenerationCommand(
inputFilePath,
tempOutputFilePath,
width
);
if (!existsSync(tempOutputFilePath)) {
throw new Error('output thumbnail file not found');
}
const thumbnail = new Uint8Array(await readFile(tempOutputFilePath));
if (!existsSync(tempOutputFilePath)) {
throw new Error('output thumbnail file not found');
}
thumbnail = new Uint8Array(await readFile(tempOutputFilePath));
quality -= 10;
} while (thumbnail.length > maxSize && quality > MIN_QUALITY);
return thumbnail;
} catch (e) {
logErrorSentry(e, 'generate image thumbnail failed');
@ -185,13 +206,15 @@ export async function generateImageThumbnail(
async function runThumbnailGenerationCommand(
inputFilePath: string,
tempOutputFilePath: string,
maxDimension: number
maxDimension: number,
quality: number
) {
const thumbnailGenerationCmd: string[] =
constructThumbnailGenerationCommand(
inputFilePath,
tempOutputFilePath,
maxDimension
maxDimension,
quality
);
const escapedCmd = shellescape(thumbnailGenerationCmd);
log.info('running thumbnail generation command: ' + escapedCmd);
@ -200,7 +223,8 @@ async function runThumbnailGenerationCommand(
function constructThumbnailGenerationCommand(
inputFilePath: string,
tempOutputFilePath: string,
maxDimension: number
maxDimension: number,
quality: number
) {
let thumbnailGenerationCmd: string[];
if (isPlatform('mac')) {
@ -215,6 +239,9 @@ function constructThumbnailGenerationCommand(
if (cmdPart === MAX_DIMENSION_PLACEHOLDER) {
return maxDimension.toString();
}
if (cmdPart === QUALITY_PLACEHOLDER) {
return quality.toString();
}
return cmdPart;
}
);

View file

@ -150,7 +150,10 @@ export default function setupIpcComs(
return deleteTempFile(tempFilePath);
});
ipcMain.handle('generate-image-thumbnail', (_, fileData, maxDimension) => {
return generateImageThumbnail(fileData, maxDimension);
});
ipcMain.handle(
'generate-image-thumbnail',
(_, fileData, maxDimension, maxSize) => {
return generateImageThumbnail(fileData, maxDimension, maxSize);
}
);
}