1
0
mirror of https://github.com/upscayl/upscayl.git synced 2024-11-28 09:20:52 +01:00
upscayl/electron/utils/convert-and-scale.ts

75 lines
2.0 KiB
TypeScript
Raw Normal View History

2023-09-17 02:14:41 +02:00
import sharp, { FormatEnum } from "sharp";
2023-09-10 11:14:04 +02:00
import logit from "./logit";
2023-09-10 19:42:18 +02:00
import { getMainWindow } from "../main-window";
2023-09-13 16:07:45 +02:00
import { compression } from "./config-variables";
2023-09-10 11:14:04 +02:00
const convertAndScale = async (
originalImagePath: string,
upscaledImagePath: string,
processedImagePath: string,
scale: string,
saveImageAs: string,
onError: (error: any) => void
) => {
2023-09-10 19:42:18 +02:00
const mainWindow = getMainWindow();
2023-09-10 11:14:04 +02:00
const originalImage = await sharp(originalImagePath).metadata();
2023-09-17 01:59:18 +02:00
2023-09-10 11:14:04 +02:00
if (!mainWindow || !originalImage) {
throw new Error("Could not grab the original image!");
}
2023-09-18 20:30:43 +02:00
2023-09-10 11:14:04 +02:00
// Resize the image to the scale
const newImage = sharp(upscaledImagePath, {
limitInputPixels: false,
2023-09-17 01:59:18 +02:00
}).resize(
originalImage.width && originalImage.width * parseInt(scale),
2023-09-18 20:30:43 +02:00
originalImage.height && originalImage.height * parseInt(scale),
{
fit: "outside",
}
2023-09-17 01:59:18 +02:00
);
2023-09-16 12:43:14 +02:00
// Convert compression percentage (0-100) to compressionLevel (0-9)
const compressionLevel = Math.round((compression / 100) * 9);
2023-09-18 20:30:43 +02:00
logit("📐 Processing Image: ", {
originalWidth: originalImage.width,
originalHeight: originalImage.height,
scale,
saveImageAs,
compressionPercentage: compression,
compressionLevel,
});
2023-09-17 01:59:18 +02:00
2023-09-10 11:14:04 +02:00
const buffer = await newImage.toBuffer();
2023-09-13 18:15:42 +02:00
try {
2023-09-18 20:30:43 +02:00
logit("");
await sharp(buffer, {
limitInputPixels: false,
2023-09-17 01:59:18 +02:00
})
2023-09-17 02:14:41 +02:00
.toFormat(saveImageAs as keyof FormatEnum, {
2023-09-17 13:37:57 +02:00
...(saveImageAs === "jpg" && {
quality: 100 - (compression === 100 ? 99 : compression),
chromaSubsampling: "4:4:4",
}),
...(saveImageAs === "png" && {
compressionLevel,
}),
force: true,
2023-09-17 02:14:41 +02:00
})
2023-09-17 01:59:18 +02:00
.withMetadata({
orientation: originalImage.orientation,
density: originalImage.density,
})
.toFile(processedImagePath);
2023-09-13 18:15:42 +02:00
} catch (error) {
logit("❌ Error converting to: ", saveImageAs, error);
onError(error);
}
logit("✅ Done converting to: ", upscaledImagePath);
2023-09-10 11:14:04 +02:00
};
export default convertAndScale;