From a91230f614d28e7617d92ab775e3ff2671321716 Mon Sep 17 00:00:00 2001 From: evlist Date: Fri, 21 Apr 2023 18:53:38 +0200 Subject: [PATCH] Attempt to scale using a canvas element --- src/components/import/ImportSingleFile.tsx | 4 +- src/lib/image.ts | 48 ++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/lib/image.ts diff --git a/src/components/import/ImportSingleFile.tsx b/src/components/import/ImportSingleFile.tsx index 4f71e35..e75bac5 100644 --- a/src/components/import/ImportSingleFile.tsx +++ b/src/components/import/ImportSingleFile.tsx @@ -21,6 +21,7 @@ import { } from '@capacitor/filesystem'; import piexif from 'piexifjs'; import { getDate, getGps } from '../../lib/exif'; +import { resize } from '../../lib/image'; interface Props { file: File; @@ -110,6 +111,7 @@ const ImportSingleFile: Component = ({ file: file }) => { const id = exifObj.Exif[piexif.ExifIFD.ImageUniqueID]; const gps = getGps(exifObj); const date = getDate(exifObj); + const thumbnailUrl = await resize(reader.result, 128); // const gps = tags.gps; // const image = await Image.load(reader.result); // const thumbnail = image.resize({ @@ -129,7 +131,7 @@ const ImportSingleFile: Component = ({ file: file }) => { result: reader.result, exifObj, }); - setPicture({ id, gps, date, thumbnailUrl: imageUrl }); + setPicture({ id, gps, date, thumbnailUrl }); }, false ); diff --git a/src/lib/image.ts b/src/lib/image.ts new file mode 100644 index 0000000..90f34ed --- /dev/null +++ b/src/lib/image.ts @@ -0,0 +1,48 @@ +export const resize = (imageUrl: string, maxSize: number) => { + let resolver = (resizedImageUrl: any) => {}; + const img = document.createElement('img'); + img.onload = () => { + const currentMaxSize = Math.max(img.width, img.height); + const ratio = currentMaxSize / maxSize; + const nbStepsReal = Math.log2(ratio); + const nbSteps = Math.floor(nbStepsReal); + const reminder = maxSize - currentMaxSize / 2 ** nbSteps; + + const canvas = document.createElement('canvas'); + canvas.width = img.width / 2; + canvas.height = img.height / 2; + const canvasCtx = canvas.getContext('2d'); + + let src: any = img; + let width = img.width; + let height = img.height; + for (let i = 0; i < nbSteps; i++) { + width = width / 2; + height = height / 2; + canvasCtx?.drawImage(src, 0, 0, width, height); + src = canvas; + } + + const finalCanvas = document.createElement('canvas'); + finalCanvas.height = height; + finalCanvas.width = width; + const finalCanvasCtx = finalCanvas.getContext('2d'); + finalCanvasCtx?.drawImage( + canvas, + 0, + 0, + width * 4, + height * 4, + 0, + 0, + width, + height + ); + + resolver(finalCanvas.toDataURL('image/jpeg')); + }; + img.src = imageUrl; + return new Promise((resolve, reject) => { + resolver = resolve; + }); +};