summaryrefslogtreecommitdiff
path: root/src/services/drive/image-processor.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/services/drive/image-processor.ts')
-rw-r--r--src/services/drive/image-processor.ts75
1 files changed, 75 insertions, 0 deletions
diff --git a/src/services/drive/image-processor.ts b/src/services/drive/image-processor.ts
new file mode 100644
index 0000000000..3c538390b0
--- /dev/null
+++ b/src/services/drive/image-processor.ts
@@ -0,0 +1,75 @@
+import * as sharp from 'sharp';
+
+export type IImage = {
+ data: Buffer;
+ ext: string;
+ type: string;
+};
+
+/**
+ * Convert to JPEG
+ * with resize, remove metadata, resolve orientation, stop animation
+ */
+export async function ConvertToJpeg(path: string, width: number, height: number): Promise<IImage> {
+ const data = await sharp(path)
+ .resize(width, height, {
+ fit: 'inside',
+ withoutEnlargement: true
+ })
+ .rotate()
+ .jpeg({
+ quality: 85,
+ progressive: true
+ })
+ .toBuffer();
+
+ return {
+ data,
+ ext: 'jpg',
+ type: 'image/jpeg'
+ };
+}
+
+/**
+ * Convert to WebP
+ * with resize, remove metadata, resolve orientation, stop animation
+ */
+export async function ConvertToWebp(path: string, width: number, height: number): Promise<IImage> {
+ const data = await sharp(path)
+ .resize(width, height, {
+ fit: 'inside',
+ withoutEnlargement: true
+ })
+ .rotate()
+ .webp({
+ quality: 85
+ })
+ .toBuffer();
+
+ return {
+ data,
+ ext: 'webp',
+ type: 'image/webp'
+ };
+}
+
+/**
+ * Convert to PNG
+ * with resize, remove metadata, resolve orientation, stop animation
+ */
+export async function ConvertToPng(path: string, width: number, height: number): Promise<IImage> {
+ const data = await sharp(path)
+ .resize(width, height, {
+ fit: 'inside',
+ withoutEnlargement: true
+ })
+ .rotate()
+ .png()
+ .toBuffer();
+
+ return {
+ data,
+ ext: 'png',
+ type: 'image/png'
+ };
+}