aboutsummaryrefslogtreecommitdiff
path: root/src/client/util/Import & Export/ImageUtils.ts
diff options
context:
space:
mode:
authorbobzel <zzzman@gmail.com>2025-08-14 13:02:53 -0400
committerbobzel <zzzman@gmail.com>2025-08-14 13:02:53 -0400
commitcabd82bea8eb4c69f60c8b5d4f987cf484123ecd (patch)
tree00430ea11b9eaa0dc032a8f7941849bbb9e0bf44 /src/client/util/Import & Export/ImageUtils.ts
parent467f1c2543626a50d48c84669cd408571260f147 (diff)
moved background removal code into ImageUtils
Diffstat (limited to 'src/client/util/Import & Export/ImageUtils.ts')
-rw-r--r--src/client/util/Import & Export/ImageUtils.ts48
1 files changed, 48 insertions, 0 deletions
diff --git a/src/client/util/Import & Export/ImageUtils.ts b/src/client/util/Import & Export/ImageUtils.ts
index eae3460b3..e2eab9010 100644
--- a/src/client/util/Import & Export/ImageUtils.ts
+++ b/src/client/util/Import & Export/ImageUtils.ts
@@ -1,9 +1,11 @@
import { ClientUtils } from '../../../ClientUtils';
import { Doc } from '../../../fields/Doc';
+import { DocData } from '../../../fields/DocSymbols';
import { Id } from '../../../fields/FieldSymbols';
import { Cast, NumCast, StrCast } from '../../../fields/Types';
import { ImageField } from '../../../fields/URLField';
import { Upload } from '../../../server/SharedMediaTypes';
+import { Docs, DocumentOptions } from '../../documents/Documents';
import { Networking } from '../../Network';
export namespace ImageUtils {
@@ -31,4 +33,50 @@ export namespace ImageUtils {
a.download = `Dash Export [${StrCast(collection.title)}].zip`;
a.click();
};
+
+ export function convertImgBlobToDataURL(blob: unknown) {
+ return new Promise<string | ArrayBuffer | null>((resolve, reject) => {
+ const reader = new FileReader();
+ reader.onload = () => resolve(reader.result);
+ reader.onerror = e => reject(e);
+ reader.readAsDataURL(blob as Blob);
+ });
+ };
+ export function createImageDocFromBlob(blob: Blob, options: DocumentOptions, docId: string, nativeWidth: number, nativeHeight: number): Promise<Doc> {
+ return new Promise((resolve, reject) => {
+ convertImgBlobToDataURL(blob).then(durl => {
+ ClientUtils.convertDataUri(durl as string, docId + '_noBgd').then(url => {
+ const imageSnapshot = Docs.Create.ImageDocument(url, options);
+ Doc.SetNativeWidth(imageSnapshot[DocData], nativeWidth);
+ Doc.SetNativeHeight(imageSnapshot[DocData], nativeHeight);
+ resolve(imageSnapshot);
+ }).catch(reject);
+ }).catch(reject);
+ });
+ }
+ let backgroundRemovalWorker: Worker|undefined;
+ const workerCallbackMap = new Map<string, (result: Doc) => void>();
+ function getBackgroundRemovalWorker() {
+ if (backgroundRemovalWorker) return backgroundRemovalWorker;
+ backgroundRemovalWorker = new Worker('/image.worker.js', { type: 'module' });
+ backgroundRemovalWorker.onerror = (e: ErrorEvent) => console.error('Worker failed:', e); // worker.terminate();
+ backgroundRemovalWorker.onmessage = async (event: MessageEvent) => {
+ if (event.data.success) {
+ createImageDocFromBlob(event.data.result, event.data.options, event.data.docId, event.data.nativeWidth, event.data.nativeHeight)
+ .then(imageSnapshot => {
+ workerCallbackMap.get(event.data.docId)?.(imageSnapshot);
+ workerCallbackMap.delete(event.data.docId);
+ })
+ } else {
+ console.error('Error in background removal:', event.data.error);
+ }
+ // worker.terminate();
+ };
+ return backgroundRemovalWorker;
+
+ }
+ export function removeImgBackground(options:DocumentOptions, cb: (result: Doc) => void, docId: string, nativeWidth:number, nativeHeight:number, docImgPath: string) {
+ workerCallbackMap.set(docId, cb); // Store the callback by docId (or use a unique requestId)
+ getBackgroundRemovalWorker().postMessage({ imagePath: docImgPath, options, docId, nativeWidth, nativeHeight });
+ };
}