about summary refs log tree commit diff
path: root/src/lib/media/manip.web.ts
diff options
context:
space:
mode:
authorKae <80987908+Novaenia@users.noreply.github.com>2025-04-27 04:10:32 +1000
committerGitHub <noreply@github.com>2025-04-26 11:10:32 -0700
commit1eb678cabd5816b81507d6387672593a1399bbf4 (patch)
tree37b7a59c9b7b6aea61036601516561e033ffae98 /src/lib/media/manip.web.ts
parentea718190ca3269ff8c9aac28257ce9e87c847f6c (diff)
downloadvoidsky-1eb678cabd5816b81507d6387672593a1399bbf4.tar.zst
Optimize compressImage method to also use binary search (#7490)
* use binary search for compressImage

* use binary search for doResize (mobile version)

* use binary search for doResize (web version)

* use safeDeleteAsync in compressImage

---------

Co-authored-by: nguyen <nguyensvo123@gmail.com>
Diffstat (limited to 'src/lib/media/manip.web.ts')
-rw-r--r--src/lib/media/manip.web.ts21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/lib/media/manip.web.ts b/src/lib/media/manip.web.ts
index 4761f2fe0..ffef7314d 100644
--- a/src/lib/media/manip.web.ts
+++ b/src/lib/media/manip.web.ts
@@ -72,17 +72,28 @@ interface DoResizeOpts {
 async function doResize(dataUri: string, opts: DoResizeOpts): Promise<RNImage> {
   let newDataUri
 
-  for (let i = 0; i <= 10; i++) {
-    newDataUri = await createResizedImage(dataUri, {
+  let minQualityPercentage = 0
+  let maxQualityPercentage = 101 //exclusive
+
+  while (maxQualityPercentage - minQualityPercentage > 1) {
+    const qualityPercentage = Math.round(
+      (maxQualityPercentage + minQualityPercentage) / 2,
+    )
+    const tempDataUri = await createResizedImage(dataUri, {
       width: opts.width,
       height: opts.height,
-      quality: 1 - i * 0.1,
+      quality: qualityPercentage / 100,
       mode: opts.mode,
     })
-    if (getDataUriSize(newDataUri) < opts.maxSize) {
-      break
+
+    if (getDataUriSize(tempDataUri) < opts.maxSize) {
+      minQualityPercentage = qualityPercentage
+      newDataUri = tempDataUri
+    } else {
+      maxQualityPercentage = qualityPercentage
     }
   }
+
   if (!newDataUri) {
     throw new Error('Failed to compress image')
   }