@pixzle/browser 0.0.29 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,17 +10,40 @@ npm i @pixzle/browser
10
10
 
11
11
  ## Usage
12
12
 
13
+ ### Restore multiple images
14
+
15
+ ```typescript
16
+ import pixzle from '@pixzle/browser';
17
+
18
+ const restoredBitmaps = await pixzle.restore({
19
+ images: ['https://example.com/fragment1.png', 'https://example.com/fragment2.png'],
20
+ manifest: 'https://example.com/manifest.json',
21
+ });
22
+
23
+ // Draw each restored image to canvas
24
+ restoredBitmaps.forEach((bitmap) => {
25
+ const canvas = document.createElement('canvas');
26
+ canvas.width = bitmap.width;
27
+ canvas.height = bitmap.height;
28
+ const ctx = canvas.getContext('2d');
29
+ ctx.drawImage(bitmap, 0, 0);
30
+ document.body.appendChild(canvas);
31
+ });
32
+ ```
33
+
34
+ ### Restore a single image
35
+
13
36
  ```typescript
14
- import { BrowserImageRestorer } from '@pixzle/browser';
37
+ import pixzle, { fetchManifest } from '@pixzle/browser';
15
38
 
16
- const restorer = new BrowserImageRestorer();
39
+ const manifest = await fetchManifest('https://example.com/manifest.json');
17
40
 
18
- const restoredBitmap = await restorer.restoreImage(
19
- 'path/to/fragmented/image.png', // or URL, Blob, HTMLImageElement, ImageBitmap
20
- 8, // blockSize
21
- 72411, // seed
22
- { w: 500, h: 500 } // imageInfo
23
- );
41
+ const restoredBitmap = await pixzle.restoreImage({
42
+ image: 'https://example.com/fragment.png', // or Blob, HTMLImageElement, ImageBitmap
43
+ blockSize: manifest.config.blockSize,
44
+ seed: manifest.config.seed,
45
+ imageInfo: manifest.images[0],
46
+ });
24
47
 
25
48
  // Draw to canvas
26
49
  const canvas = document.createElement('canvas');
package/dist/block.d.ts CHANGED
@@ -5,4 +5,13 @@ export declare function splitImageToBlocks(image: HTMLImageElement | ImageBitmap
5
5
  /**
6
6
  * Create an ImageBitmap from blocks
7
7
  */
8
- export declare function blocksToImage(blocks: Uint8Array[], width: number, height: number, blockSize: number): Promise<ImageBitmap>;
8
+ export declare function blocksToImageBitmap(blocks: Uint8Array[], width: number, height: number, blockSize: number): Promise<ImageBitmap>;
9
+ /**
10
+ * Process blocks per image using a provided function (shuffle/unshuffle)
11
+ * @param allBlocks - All blocks to process
12
+ * @param fragmentBlocksCount - Number of blocks per fragment
13
+ * @param seed - Seed for the processing function
14
+ * @param processFunc - Function to apply to blocks (shuffle or unshuffle)
15
+ * @returns Processed blocks
16
+ */
17
+ export declare function blocksPerImage(allBlocks: Uint8Array[], fragmentBlocksCount: number[], seed: number | string, processFunc: (blocks: Uint8Array[], seed: number | string) => Uint8Array[]): Uint8Array[];
package/dist/block.js CHANGED
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.splitImageToBlocks = splitImageToBlocks;
4
- exports.blocksToImage = blocksToImage;
4
+ exports.blocksToImageBitmap = blocksToImageBitmap;
5
+ exports.blocksPerImage = blocksPerImage;
5
6
  const core_1 = require("@pixzle/core");
6
7
  /**
7
8
  * Split an image (HTMLImageElement or ImageBitmap) into blocks
@@ -27,10 +28,29 @@ function splitImageToBlocks(image, blockSize) {
27
28
  /**
28
29
  * Create an ImageBitmap from blocks
29
30
  */
30
- async function blocksToImage(blocks, width, height, blockSize) {
31
+ async function blocksToImageBitmap(blocks, width, height, blockSize) {
31
32
  const buffer = (0, core_1.blocksToImageBuffer)(blocks, width, height, blockSize);
32
33
  // Create ImageData
33
34
  const imageData = new ImageData(new Uint8ClampedArray(buffer.buffer, buffer.byteOffset, buffer.byteLength), width, height);
34
35
  return createImageBitmap(imageData);
35
36
  }
37
+ /**
38
+ * Process blocks per image using a provided function (shuffle/unshuffle)
39
+ * @param allBlocks - All blocks to process
40
+ * @param fragmentBlocksCount - Number of blocks per fragment
41
+ * @param seed - Seed for the processing function
42
+ * @param processFunc - Function to apply to blocks (shuffle or unshuffle)
43
+ * @returns Processed blocks
44
+ */
45
+ function blocksPerImage(allBlocks, fragmentBlocksCount, seed, processFunc) {
46
+ const processedBlocks = [];
47
+ let offset = 0;
48
+ for (const blockCount of fragmentBlocksCount) {
49
+ const imageBlocks = allBlocks.slice(offset, offset + blockCount);
50
+ const processed = processFunc(imageBlocks, seed);
51
+ processedBlocks.push(...processed);
52
+ offset += blockCount;
53
+ }
54
+ return processedBlocks;
55
+ }
36
56
  //# sourceMappingURL=block.js.map
package/dist/block.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"block.js","sourceRoot":"","sources":["../src/block.ts"],"names":[],"mappings":";;AAQA,gDA6BC;AAKD,sCAoBC;AA9DD,uCAGsB;AAEtB;;GAEG;AACH,SAAgB,kBAAkB,CAChC,KAAqC,EACrC,SAAiB;IAEjB,MAAM,KAAK,GACT,KAAK,YAAY,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IACvE,MAAM,MAAM,GACV,KAAK,YAAY,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAEzE,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAEtD,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAExD,0DAA0D;IAC1D,+FAA+F;IAC/F,0BAA0B;IAC1B,6CAA6C;IAC7C,MAAM,MAAM,GAAG,IAAI,UAAU,CAC3B,SAAS,CAAC,IAAI,CAAC,MAAM,EACrB,SAAS,CAAC,IAAI,CAAC,UAAU,EACzB,SAAS,CAAC,IAAI,CAAC,UAAU,CAC1B,CAAC;IAEF,OAAO,IAAA,yBAAsB,EAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,aAAa,CACjC,MAAoB,EACpB,KAAa,EACb,MAAc,EACd,SAAiB;IAEjB,MAAM,MAAM,GAAG,IAAA,0BAAuB,EAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAEzE,mBAAmB;IACnB,MAAM,SAAS,GAAG,IAAI,SAAS,CAC7B,IAAI,iBAAiB,CACnB,MAAM,CAAC,MAAqB,EAC5B,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,UAAU,CAClB,EACD,KAAK,EACL,MAAM,CACP,CAAC;IAEF,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"block.js","sourceRoot":"","sources":["../src/block.ts"],"names":[],"mappings":";;AAQA,gDA6BC;AAKD,kDAoBC;AAUD,wCAiBC;AAzFD,uCAGsB;AAEtB;;GAEG;AACH,SAAgB,kBAAkB,CAChC,KAAqC,EACrC,SAAiB;IAEjB,MAAM,KAAK,GACT,KAAK,YAAY,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC;IACvE,MAAM,MAAM,GACV,KAAK,YAAY,gBAAgB,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAEzE,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAEtD,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3B,MAAM,SAAS,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAExD,0DAA0D;IAC1D,+FAA+F;IAC/F,0BAA0B;IAC1B,6CAA6C;IAC7C,MAAM,MAAM,GAAG,IAAI,UAAU,CAC3B,SAAS,CAAC,IAAI,CAAC,MAAM,EACrB,SAAS,CAAC,IAAI,CAAC,UAAU,EACzB,SAAS,CAAC,IAAI,CAAC,UAAU,CAC1B,CAAC;IAEF,OAAO,IAAA,yBAAsB,EAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAClE,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,mBAAmB,CACvC,MAAoB,EACpB,KAAa,EACb,MAAc,EACd,SAAiB;IAEjB,MAAM,MAAM,GAAG,IAAA,0BAAuB,EAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IAEzE,mBAAmB;IACnB,MAAM,SAAS,GAAG,IAAI,SAAS,CAC7B,IAAI,iBAAiB,CACnB,MAAM,CAAC,MAAqB,EAC5B,MAAM,CAAC,UAAU,EACjB,MAAM,CAAC,UAAU,CAClB,EACD,KAAK,EACL,MAAM,CACP,CAAC;IAEF,OAAO,iBAAiB,CAAC,SAAS,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,cAAc,CAC5B,SAAuB,EACvB,mBAA6B,EAC7B,IAAqB,EACrB,WAA0E;IAE1E,MAAM,eAAe,GAAiB,EAAE,CAAC;IACzC,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,UAAU,IAAI,mBAAmB,EAAE,CAAC;QAC7C,MAAM,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,WAAW,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACjD,eAAe,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC;QACnC,MAAM,IAAI,UAAU,CAAC;IACvB,CAAC;IAED,OAAO,eAAe,CAAC;AACzB,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,40 @@
1
- export * from "./restorer";
2
- export * from "./block";
1
+ import type { ImageInfo, ManifestData } from "@pixzle/core";
2
+ import { ImageRestorer, type ImageSource } from "./restorer";
3
+ export { ImageRestorer, type ImageSource };
4
+ export interface BrowserRestoreOptions {
5
+ /** Image sources - URLs, Blobs, HTMLImageElements, or ImageBitmaps */
6
+ images: ImageSource[];
7
+ /** Manifest source - URL string (e.g., "https://example.com/manifest.json") */
8
+ manifest?: string;
9
+ /** Manifest data object (alternative to manifest) */
10
+ manifestData?: ManifestData;
11
+ }
12
+ export interface BrowserRestoreImageOptions {
13
+ /** Image source - URL, Blob, HTMLImageElement, or ImageBitmap */
14
+ image: ImageSource;
15
+ /** Block size used for fragmentation */
16
+ blockSize: number;
17
+ /** Seed used for shuffling */
18
+ seed: number;
19
+ /** Information about the original image (dimensions) */
20
+ imageInfo: ImageInfo;
21
+ }
22
+ /**
23
+ * Fetch JSON from a URL
24
+ * @param url The URL to fetch JSON from
25
+ * @returns Promise resolving to the parsed JSON
26
+ */
27
+ export declare function fetchJson<T>(url: string): Promise<T>;
28
+ /**
29
+ * Fetch manifest data from a URL
30
+ * @param url The URL to fetch manifest from
31
+ * @returns Promise resolving to ManifestData
32
+ */
33
+ export declare function fetchManifest(url: string): Promise<ManifestData>;
34
+ declare function restore(options: BrowserRestoreOptions): Promise<ImageBitmap[]>;
35
+ declare function restoreImage(options: BrowserRestoreImageOptions): Promise<ImageBitmap>;
36
+ declare const pixzle: {
37
+ restore: typeof restore;
38
+ restoreImage: typeof restoreImage;
39
+ };
40
+ export default pixzle;
package/dist/index.js CHANGED
@@ -1,19 +1,89 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ImageRestorer = void 0;
4
+ exports.fetchJson = fetchJson;
5
+ exports.fetchManifest = fetchManifest;
6
+ const restorer_1 = require("./restorer");
7
+ Object.defineProperty(exports, "ImageRestorer", { enumerable: true, get: function () { return restorer_1.ImageRestorer; } });
8
+ /**
9
+ * Fetch JSON from a URL
10
+ * @param url The URL to fetch JSON from
11
+ * @returns Promise resolving to the parsed JSON
12
+ */
13
+ async function fetchJson(url) {
14
+ const response = await fetch(url);
15
+ if (!response.ok) {
16
+ throw new Error(`Failed to fetch: ${response.status} ${response.statusText}`);
17
+ }
18
+ return response.json();
19
+ }
20
+ /**
21
+ * Fetch manifest data from a URL
22
+ * @param url The URL to fetch manifest from
23
+ * @returns Promise resolving to ManifestData
24
+ */
25
+ async function fetchManifest(url) {
26
+ return fetchJson(url);
27
+ }
28
+ function validateFragmentImageCount(fragmentImages, manifest) {
29
+ const manifestImageCount = manifest.images.length;
30
+ const fragmentImageCount = fragmentImages.length;
31
+ if (manifestImageCount !== fragmentImageCount) {
32
+ throw new Error(`Fragment image count mismatch: expected ${manifestImageCount} but got ${fragmentImageCount}`);
33
+ }
34
+ }
35
+ async function restore(options) {
36
+ const { images, manifest: manifestSource, manifestData, } = validateRestoreOptions(options);
37
+ let manifest;
38
+ if (manifestData) {
39
+ manifest = manifestData;
7
40
  }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
- for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
41
+ else if (manifestSource) {
42
+ manifest = await fetchManifest(manifestSource);
43
+ }
44
+ else {
45
+ throw new Error("Manifest not provided");
46
+ }
47
+ validateFragmentImageCount(images, manifest);
48
+ const restorer = new restorer_1.ImageRestorer();
49
+ return await restorer.restoreImages(images, manifest);
50
+ }
51
+ async function restoreImage(options) {
52
+ const { image, blockSize, seed, imageInfo } = validateRestoreImageOptions(options);
53
+ const restorer = new restorer_1.ImageRestorer();
54
+ return await restorer.restoreImage(image, blockSize, seed, imageInfo);
55
+ }
56
+ const pixzle = {
57
+ restore,
58
+ restoreImage,
15
59
  };
16
- Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./restorer"), exports);
18
- __exportStar(require("./block"), exports);
60
+ exports.default = pixzle;
61
+ function validateRestoreOptions(options) {
62
+ if (!options)
63
+ throw new Error("[restore] Options object is required.");
64
+ const { images, manifest, manifestData } = options;
65
+ if (!images || !Array.isArray(images) || images.length === 0)
66
+ throw new Error("[restore] images must be a non-empty array.");
67
+ if (!manifest && !manifestData)
68
+ throw new Error("[restore] Either manifest or manifestData is required.");
69
+ if (manifest && typeof manifest !== "string")
70
+ throw new Error("[restore] manifest must be a string.");
71
+ return options;
72
+ }
73
+ function validateRestoreImageOptions(options) {
74
+ if (!options)
75
+ throw new Error("[restoreImage] Options object is required.");
76
+ const { image, blockSize, seed, imageInfo } = options;
77
+ if (!image)
78
+ throw new Error("[restoreImage] image is required.");
79
+ if (typeof blockSize !== "number" || blockSize <= 0)
80
+ throw new Error("[restoreImage] blockSize must be a positive number.");
81
+ if (typeof seed !== "number")
82
+ throw new Error("[restoreImage] seed must be a number.");
83
+ if (!imageInfo ||
84
+ typeof imageInfo.w !== "number" ||
85
+ typeof imageInfo.h !== "number")
86
+ throw new Error("[restoreImage] imageInfo with valid w and h is required.");
87
+ return options;
88
+ }
19
89
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,13 @@
1
- import { type ImageInfo } from "@pixzle/core";
2
- export declare class BrowserImageRestorer {
1
+ import { type ImageInfo, type ManifestData } from "@pixzle/core";
2
+ export type ImageSource = string | URL | Blob | HTMLImageElement | ImageBitmap;
3
+ export declare class ImageRestorer {
4
+ /**
5
+ * Restore multiple images from shuffled fragments
6
+ * @param fragments Array of fragment sources (URLs, Blobs, HTMLImageElements, or ImageBitmaps)
7
+ * @param manifest The manifest data containing restoration information
8
+ * @returns Promise resolving to an array of restored ImageBitmaps
9
+ */
10
+ restoreImages(fragments: ImageSource[], manifest: ManifestData): Promise<ImageBitmap[]>;
3
11
  /**
4
12
  * Restore a single image from a shuffled source
5
13
  * @param imageSource The shuffled image (URL, Blob, HTMLImageElement, or ImageBitmap)
@@ -8,6 +16,10 @@ export declare class BrowserImageRestorer {
8
16
  * @param imageInfo Information about the original image (dimensions)
9
17
  * @returns Promise resolving to the restored ImageBitmap
10
18
  */
11
- restoreImage(imageSource: string | URL | Blob | HTMLImageElement | ImageBitmap, blockSize: number, seed: number | string, imageInfo: ImageInfo): Promise<ImageBitmap>;
19
+ restoreImage(imageSource: ImageSource, blockSize: number, seed: number, imageInfo: ImageInfo): Promise<ImageBitmap>;
12
20
  private _loadImage;
21
+ private _prepareData;
22
+ private _readBlocksFromFragment;
23
+ private _readBlocks;
24
+ private _reconstructImages;
13
25
  }
package/dist/restorer.js CHANGED
@@ -1,10 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.BrowserImageRestorer = void 0;
3
+ exports.ImageRestorer = void 0;
4
4
  const core_1 = require("@pixzle/core");
5
5
  const seeded_shuffle_1 = require("@tuki0918/seeded-shuffle");
6
6
  const block_1 = require("./block");
7
- class BrowserImageRestorer {
7
+ class ImageRestorer {
8
+ /**
9
+ * Restore multiple images from shuffled fragments
10
+ * @param fragments Array of fragment sources (URLs, Blobs, HTMLImageElements, or ImageBitmaps)
11
+ * @param manifest The manifest data containing restoration information
12
+ * @returns Promise resolving to an array of restored ImageBitmaps
13
+ */
14
+ async restoreImages(fragments, manifest) {
15
+ const { blocks, blockCountsPerImage } = await this._prepareData(fragments, manifest);
16
+ const restored = manifest.config.crossImageShuffle
17
+ ? (0, seeded_shuffle_1.unshuffle)(blocks, manifest.config.seed)
18
+ : (0, block_1.blocksPerImage)(blocks, blockCountsPerImage, manifest.config.seed, seeded_shuffle_1.unshuffle);
19
+ return await this._reconstructImages(restored, manifest);
20
+ }
8
21
  /**
9
22
  * Restore a single image from a shuffled source
10
23
  * @param imageSource The shuffled image (URL, Blob, HTMLImageElement, or ImageBitmap)
@@ -14,13 +27,9 @@ class BrowserImageRestorer {
14
27
  * @returns Promise resolving to the restored ImageBitmap
15
28
  */
16
29
  async restoreImage(imageSource, blockSize, seed, imageInfo) {
17
- const image = await this._loadImage(imageSource);
18
- // Split the fragment image into blocks and take only the expected number
19
- // The fragment image may have extra padding blocks due to its square-ish layout
20
- const allBlocks = (0, block_1.splitImageToBlocks)(image, blockSize);
21
- const blocks = (0, core_1.extractExpectedBlocks)(allBlocks, imageInfo.w, imageInfo.h, blockSize);
22
- const restoredBlocks = (0, seeded_shuffle_1.unshuffle)(blocks, seed);
23
- return (0, block_1.blocksToImage)(restoredBlocks, imageInfo.w, imageInfo.h, blockSize);
30
+ const manifest = (0, core_1.createSingleImageManifest)({ blockSize, seed, imageInfo });
31
+ const [restoredImage] = await this.restoreImages([imageSource], manifest);
32
+ return restoredImage;
24
33
  }
25
34
  async _loadImage(sourceInput) {
26
35
  let source = sourceInput;
@@ -53,6 +62,35 @@ class BrowserImageRestorer {
53
62
  }
54
63
  throw new Error("Unsupported image source");
55
64
  }
65
+ async _prepareData(fragments, manifest) {
66
+ const totalBlocks = (0, core_1.calculateTotalBlocks)(manifest.images, manifest.config.blockSize);
67
+ const blockCountsForCrossImages = (0, core_1.calculateBlockCountsForCrossImages)(totalBlocks, fragments.length);
68
+ // Calculate actual block counts per image for per-image unshuffle
69
+ const blockCountsPerImage = (0, core_1.calculateBlockCountsPerImage)(manifest.images, manifest.config.blockSize);
70
+ // Use blockCountsPerImage when crossImageShuffle is false
71
+ const blockCounts = manifest.config.crossImageShuffle
72
+ ? blockCountsForCrossImages
73
+ : blockCountsPerImage;
74
+ const blocks = await this._readBlocks(fragments, manifest, blockCounts);
75
+ return { blocks, blockCountsPerImage };
76
+ }
77
+ async _readBlocksFromFragment(fragment, manifest, expectedCount) {
78
+ const image = await this._loadImage(fragment);
79
+ const blocks = (0, block_1.splitImageToBlocks)(image, manifest.config.blockSize);
80
+ return (0, core_1.takeBlocks)(blocks, expectedCount);
81
+ }
82
+ async _readBlocks(fragments, manifest, blockCounts) {
83
+ const blockGroups = await Promise.all(fragments.map((fragment, i) => this._readBlocksFromFragment(fragment, manifest, blockCounts[i])));
84
+ return blockGroups.flat();
85
+ }
86
+ async _reconstructImages(blocks, manifest) {
87
+ const blockCountsPerImage = (0, core_1.calculateBlockCountsPerImage)(manifest.images, manifest.config.blockSize);
88
+ return await Promise.all(manifest.images.map(async (imageInfo, index) => {
89
+ const { start, end } = (0, core_1.calculateBlockRange)(blockCountsPerImage, index);
90
+ const imageBlocks = blocks.slice(start, end);
91
+ return await (0, block_1.blocksToImageBitmap)(imageBlocks, imageInfo.w, imageInfo.h, manifest.config.blockSize);
92
+ }));
93
+ }
56
94
  }
57
- exports.BrowserImageRestorer = BrowserImageRestorer;
95
+ exports.ImageRestorer = ImageRestorer;
58
96
  //# sourceMappingURL=restorer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"restorer.js","sourceRoot":"","sources":["../src/restorer.ts"],"names":[],"mappings":";;;AAAA,uCAAqE;AACrE,6DAAqD;AACrD,mCAA4D;AAE5D,MAAa,oBAAoB;IAC/B;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAChB,WAAiE,EACjE,SAAiB,EACjB,IAAqB,EACrB,SAAoB;QAEpB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAEjD,yEAAyE;QACzE,gFAAgF;QAChF,MAAM,SAAS,GAAG,IAAA,0BAAkB,EAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACvD,MAAM,MAAM,GAAG,IAAA,4BAAqB,EAClC,SAAS,EACT,SAAS,CAAC,CAAC,EACX,SAAS,CAAC,CAAC,EACX,SAAS,CACV,CAAC;QAEF,MAAM,cAAc,GAAG,IAAA,0BAAS,EAAC,MAAM,EAAE,IAAI,CAAiB,CAAC;QAE/D,OAAO,IAAA,qBAAa,EAAC,cAAc,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC5E,CAAC;IAEO,KAAK,CAAC,UAAU,CACtB,WAAiE;QAEjE,IAAI,MAAM,GAAG,WAAW,CAAC;QACzB,IAAI,OAAO,GAAG,KAAK,WAAW,IAAI,MAAM,YAAY,GAAG,EAAE,CAAC;YACxD,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC;QAED,IACE,OAAO,gBAAgB,KAAK,WAAW;YACvC,MAAM,YAAY,gBAAgB,EAClC,CAAC;YACD,IAAI,MAAM,CAAC,QAAQ;gBAAE,OAAO,MAAM,CAAC;YACnC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACpC,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC;gBACxB,MAAM,CAAC,OAAO,GAAG,MAAM,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,OAAO,WAAW,KAAK,WAAW,IAAI,MAAM,YAAY,WAAW,EAAE,CAAC;YACxE,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,MAAM,YAAY,IAAI,EAAE,CAAC;YAC1D,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACnC,CAAC;QAED,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,KAAK,CACb,0BAA0B,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CACnE,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YACnC,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACjC,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;CACF;AAzED,oDAyEC"}
1
+ {"version":3,"file":"restorer.js","sourceRoot":"","sources":["../src/restorer.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pixzle/browser",
3
- "version": "0.0.29",
3
+ "version": "0.1.0",
4
4
  "description": "Browser implementation of image fragmentation and restoration",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -36,7 +36,7 @@
36
36
  },
37
37
  "dependencies": {
38
38
  "@tuki0918/seeded-shuffle": "^1.0.0",
39
- "@pixzle/core": "0.0.29"
39
+ "@pixzle/core": "0.1.0"
40
40
  },
41
41
  "devDependencies": {
42
42
  "happy-dom": "^20.0.11",