@fideus-labs/fiff 0.2.0 → 0.3.1
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 +22 -10
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/tiff-writer.d.ts +66 -9
- package/dist/tiff-writer.d.ts.map +1 -1
- package/dist/tiff-writer.js +388 -121
- package/dist/tiff-writer.js.map +1 -1
- package/dist/write.d.ts +28 -2
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +44 -30
- package/dist/write.js.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -37,8 +37,14 @@
|
|
|
37
37
|
valid OME-TIFF files with embedded OME-XML metadata
|
|
38
38
|
- 🔻 **Full pyramid support** -- Multi-resolution levels are written as SubIFDs,
|
|
39
39
|
matching the modern OME-TIFF pyramid convention
|
|
40
|
-
- 🗜️ **Deflate compression** --
|
|
41
|
-
|
|
40
|
+
- 🗜️ **Deflate compression** -- Async zlib/deflate via native `CompressionStream`
|
|
41
|
+
(non-blocking) with synchronous pako fallback
|
|
42
|
+
- 🧱 **Tiled output** -- Large images are automatically written as 256x256 tiles
|
|
43
|
+
(configurable), the OME-TIFF recommended format for efficient random access
|
|
44
|
+
- ⚡ **Parallel plane reading** -- Planes are read with bounded concurrency
|
|
45
|
+
(configurable) for faster writes from async data sources
|
|
46
|
+
- 💾 **BigTIFF support** -- Automatic 64-bit offset format when files exceed
|
|
47
|
+
4 GB, with manual override via `format` option
|
|
42
48
|
- 📐 **5D support** -- Handles all dimension orders (XYZCT, XYZTC, etc.) and
|
|
43
49
|
arbitrary combinations of T, C, Z, Y, X axes
|
|
44
50
|
|
|
@@ -176,6 +182,9 @@ const buffer = await toOmeTiff(multiscales, {
|
|
|
176
182
|
dimensionOrder: "XYZCT", // IFD layout order, default "XYZCT"
|
|
177
183
|
imageName: "my-image", // name in OME-XML metadata
|
|
178
184
|
creator: "my-app", // creator string in OME-XML
|
|
185
|
+
tileSize: 256, // tile size in px (0 = strip-based), default 256
|
|
186
|
+
concurrency: 4, // parallel plane reads, default 4
|
|
187
|
+
format: "auto", // "auto" | "classic" | "bigtiff", default "auto"
|
|
179
188
|
});
|
|
180
189
|
```
|
|
181
190
|
|
|
@@ -259,13 +268,16 @@ All factory methods accept an optional `TiffStoreOptions` object:
|
|
|
259
268
|
|
|
260
269
|
### WriteOptions
|
|
261
270
|
|
|
262
|
-
| Option | Type
|
|
263
|
-
| ------------------ |
|
|
264
|
-
| `compression` | `"none" \| "deflate"`
|
|
265
|
-
| `compressionLevel` | `number`
|
|
266
|
-
| `dimensionOrder` | `string`
|
|
267
|
-
| `imageName` | `string`
|
|
268
|
-
| `creator` | `string`
|
|
271
|
+
| Option | Type | Default | Description |
|
|
272
|
+
| ------------------ | -------------------------------------- | ----------- | ----------------------------------------- |
|
|
273
|
+
| `compression` | `"none" \| "deflate"` | `"deflate"` | Pixel data compression |
|
|
274
|
+
| `compressionLevel` | `number` | `6` | Deflate level 1-9 (higher = smaller) |
|
|
275
|
+
| `dimensionOrder` | `string` | `"XYZCT"` | IFD plane layout order |
|
|
276
|
+
| `imageName` | `string` | `"image"` | Image name in OME-XML |
|
|
277
|
+
| `creator` | `string` | `"fiff"` | Creator string in OME-XML |
|
|
278
|
+
| `tileSize` | `number` | `256` | Tile size (0 = strip-based, must be x16) |
|
|
279
|
+
| `concurrency` | `number` | `4` | Max parallel plane reads |
|
|
280
|
+
| `format` | `"auto" \| "classic" \| "bigtiff"` | `"auto"` | TIFF format (auto-detects BigTIFF > 4 GB) |
|
|
269
281
|
|
|
270
282
|
## 🛠️ Development
|
|
271
283
|
|
|
@@ -298,7 +310,7 @@ src/
|
|
|
298
310
|
ome-xml-writer.ts # OME-XML generation from Multiscales metadata
|
|
299
311
|
test/
|
|
300
312
|
fixtures.ts # Test TIFF generation helpers
|
|
301
|
-
*.test.ts #
|
|
313
|
+
*.test.ts # 201 tests across 11 files
|
|
302
314
|
```
|
|
303
315
|
|
|
304
316
|
### 📝 Commands
|
package/dist/index.d.ts
CHANGED
|
@@ -22,7 +22,7 @@ export type { PyramidInfo, PlaneSelection } from "./ifd-indexer.js";
|
|
|
22
22
|
export type { OmeAxis, OmeMultiscale, OmeDataset, OmeCoordinateTransformation, OmeroMetadata, OmeroChannel, ZarrGroupMetadata, ZarrArrayMetadata, } from "./metadata.js";
|
|
23
23
|
export { toOmeTiff, type WriteOptions } from "./write.js";
|
|
24
24
|
export { buildOmeXml, type OmeXmlWriterOptions, type DimensionInfo } from "./ome-xml-writer.js";
|
|
25
|
-
export { buildTiff, makeImageTags, compressDeflate, type WritableIfd, type TiffTag, type BuildTiffOptions, } from "./tiff-writer.js";
|
|
25
|
+
export { buildTiff, makeImageTags, sliceTiles, compressDeflate, compressDeflateAsync, DEFAULT_TILE_SIZE, type WritableIfd, type TiffTag, type BuildTiffOptions, } from "./tiff-writer.js";
|
|
26
26
|
export { parseOmeXml, isOmeXml, getIfdIndex } from "./ome-xml.js";
|
|
27
27
|
export { tiffDtypeToZarr, omePixelTypeToZarr, zarrToOmePixelType, zarrToTiffDtype, bytesPerElement, type TiffDtypeInfo, } from "./dtypes.js";
|
|
28
28
|
export { parseStoreKey, computePixelWindow } from "./utils.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACpF,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpE,YAAY,EACV,OAAO,EACP,aAAa,EACb,UAAU,EACV,2BAA2B,EAC3B,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,EACf,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGnE,YAAY,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACpF,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpE,YAAY,EACV,OAAO,EACP,aAAa,EACb,UAAU,EACV,2BAA2B,EAC3B,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,SAAS,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,KAAK,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,SAAS,EACT,aAAa,EACb,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,OAAO,EACZ,KAAK,gBAAgB,GACtB,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,KAAK,aAAa,GACnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -21,7 +21,7 @@ export { TiffStore } from "./tiff-store.js";
|
|
|
21
21
|
// Writer
|
|
22
22
|
export { toOmeTiff } from "./write.js";
|
|
23
23
|
export { buildOmeXml } from "./ome-xml-writer.js";
|
|
24
|
-
export { buildTiff, makeImageTags, compressDeflate, } from "./tiff-writer.js";
|
|
24
|
+
export { buildTiff, makeImageTags, sliceTiles, compressDeflate, compressDeflateAsync, DEFAULT_TILE_SIZE, } from "./tiff-writer.js";
|
|
25
25
|
// Export utilities that may be useful
|
|
26
26
|
export { parseOmeXml, isOmeXml, getIfdIndex } from "./ome-xml.js";
|
|
27
27
|
export { tiffDtypeToZarr, omePixelTypeToZarr, zarrToOmePixelType, zarrToTiffDtype, bytesPerElement, } from "./dtypes.js";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,+BAA+B;AAE/B;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAC;AAiBnE,SAAS;AACT,OAAO,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAgD,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,SAAS,EACT,aAAa,EACb,eAAe,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,+BAA+B;AAE/B;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAC;AAiBnE,SAAS;AACT,OAAO,EAAE,SAAS,EAAqB,MAAM,YAAY,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAgD,MAAM,qBAAqB,CAAC;AAChG,OAAO,EACL,SAAS,EACT,aAAa,EACb,UAAU,EACV,eAAe,EACf,oBAAoB,EACpB,iBAAiB,GAIlB,MAAM,kBAAkB,CAAC;AAE1B,sCAAsC;AACtC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,eAAe,GAEhB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/tiff-writer.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export declare const TIFF_TYPE_ASCII = 2;
|
|
|
4
4
|
export declare const TIFF_TYPE_SHORT = 3;
|
|
5
5
|
export declare const TIFF_TYPE_LONG = 4;
|
|
6
6
|
export declare const TIFF_TYPE_RATIONAL = 5;
|
|
7
|
+
export declare const TIFF_TYPE_LONG8 = 16;
|
|
7
8
|
/** Well-known TIFF tags. */
|
|
8
9
|
export declare const TAG_NEW_SUBFILE_TYPE = 254;
|
|
9
10
|
export declare const TAG_IMAGE_WIDTH = 256;
|
|
@@ -17,11 +18,17 @@ export declare const TAG_SAMPLES_PER_PIXEL = 277;
|
|
|
17
18
|
export declare const TAG_ROWS_PER_STRIP = 278;
|
|
18
19
|
export declare const TAG_STRIP_BYTE_COUNTS = 279;
|
|
19
20
|
export declare const TAG_PLANAR_CONFIGURATION = 284;
|
|
20
|
-
export declare const
|
|
21
|
+
export declare const TAG_TILE_WIDTH = 322;
|
|
22
|
+
export declare const TAG_TILE_LENGTH = 323;
|
|
23
|
+
export declare const TAG_TILE_OFFSETS = 324;
|
|
24
|
+
export declare const TAG_TILE_BYTE_COUNTS = 325;
|
|
21
25
|
export declare const TAG_SUB_IFDS = 330;
|
|
26
|
+
export declare const TAG_SAMPLE_FORMAT = 339;
|
|
22
27
|
/** TIFF compression codes. */
|
|
23
28
|
export declare const COMPRESSION_NONE = 1;
|
|
24
29
|
export declare const COMPRESSION_DEFLATE = 8;
|
|
30
|
+
/** Default tile size (OME-TIFF convention). Must be a multiple of 16. */
|
|
31
|
+
export declare const DEFAULT_TILE_SIZE = 256;
|
|
25
32
|
/** A single TIFF tag entry. */
|
|
26
33
|
export interface TiffTag {
|
|
27
34
|
/** TIFF tag number (e.g. 256 for ImageWidth). */
|
|
@@ -33,33 +40,83 @@ export interface TiffTag {
|
|
|
33
40
|
}
|
|
34
41
|
/** Describes one IFD (image) to be written. */
|
|
35
42
|
export interface WritableIfd {
|
|
36
|
-
/** Tags for this IFD (excluding
|
|
43
|
+
/** Tags for this IFD (excluding offset/bytecount tags — those are auto-generated). */
|
|
37
44
|
tags: TiffTag[];
|
|
38
|
-
/**
|
|
39
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Raw pixel data tiles. Each entry is one tile (row-major, left-to-right
|
|
47
|
+
* then top-to-bottom). For strip-based images, this is a single entry
|
|
48
|
+
* containing the entire plane.
|
|
49
|
+
*/
|
|
50
|
+
tiles: Uint8Array[];
|
|
40
51
|
/** Optional SubIFDs attached to this IFD (for pyramid sub-resolutions). */
|
|
41
52
|
subIfds?: WritableIfd[];
|
|
42
53
|
}
|
|
43
54
|
/** Options for buildTiff. */
|
|
44
55
|
export interface BuildTiffOptions {
|
|
45
|
-
/** Compression to apply to
|
|
56
|
+
/** Compression to apply to tile data before writing. Default: "none". */
|
|
46
57
|
compression?: "none" | "deflate";
|
|
47
58
|
/** Deflate compression level (1-9). Default: 6. */
|
|
48
59
|
compressionLevel?: number;
|
|
60
|
+
/**
|
|
61
|
+
* TIFF format to use.
|
|
62
|
+
* - "auto": Use classic TIFF when possible, BigTIFF when file exceeds 4 GB.
|
|
63
|
+
* - "classic": Force classic TIFF (32-bit offsets). Fails if file > 4 GB.
|
|
64
|
+
* - "bigtiff": Force BigTIFF (64-bit offsets).
|
|
65
|
+
* Default: "auto".
|
|
66
|
+
*/
|
|
67
|
+
format?: "auto" | "classic" | "bigtiff";
|
|
49
68
|
}
|
|
50
69
|
/**
|
|
51
70
|
* Build a complete TIFF file from a list of IFDs.
|
|
52
71
|
*
|
|
72
|
+
* Tiles are compressed (if requested) eagerly and in parallel where
|
|
73
|
+
* possible. The uncompressed data is released after compression to
|
|
74
|
+
* minimise peak memory usage.
|
|
75
|
+
*
|
|
53
76
|
* @param ifds - Main IFD chain (linked via next-IFD pointers).
|
|
54
|
-
* @param options - Build options (compression, etc.).
|
|
77
|
+
* @param options - Build options (compression, format, etc.).
|
|
55
78
|
* @returns A complete TIFF file as an ArrayBuffer.
|
|
56
79
|
*/
|
|
57
|
-
export declare function buildTiff(ifds: WritableIfd[], options?: BuildTiffOptions): ArrayBuffer
|
|
80
|
+
export declare function buildTiff(ifds: WritableIfd[], options?: BuildTiffOptions): Promise<ArrayBuffer>;
|
|
58
81
|
/**
|
|
59
82
|
* Compress a Uint8Array using deflate (zlib-wrapped, RFC 1950).
|
|
60
83
|
* Compatible with TIFF compression code 8 and geotiff.js's pako.inflate().
|
|
84
|
+
*
|
|
85
|
+
* Prefers the native CompressionStream API (async, non-blocking) when
|
|
86
|
+
* available, falling back to synchronous pako.deflate().
|
|
87
|
+
*/
|
|
88
|
+
export declare function compressDeflateAsync(data: Uint8Array, level?: number): Promise<Uint8Array>;
|
|
89
|
+
/**
|
|
90
|
+
* Compress a Uint8Array using deflate (zlib-wrapped, RFC 1950) synchronously.
|
|
91
|
+
* Compatible with TIFF compression code 8 and geotiff.js's pako.inflate().
|
|
61
92
|
*/
|
|
62
93
|
export declare function compressDeflate(data: Uint8Array, level?: number): Uint8Array;
|
|
63
|
-
/**
|
|
64
|
-
|
|
94
|
+
/**
|
|
95
|
+
* Create a standard set of tags for a tiled grayscale image plane.
|
|
96
|
+
*
|
|
97
|
+
* @param width - Image width in pixels.
|
|
98
|
+
* @param height - Image height in pixels.
|
|
99
|
+
* @param bitsPerSample - Bits per sample (8, 16, 32, 64).
|
|
100
|
+
* @param sampleFormat - TIFF SampleFormat (1=uint, 2=int, 3=float).
|
|
101
|
+
* @param compression - Compression type. Default: "none".
|
|
102
|
+
* @param imageDescription - Optional OME-XML string for the first IFD.
|
|
103
|
+
* @param isSubResolution - Whether this is a SubIFD (sets NewSubfileType=1).
|
|
104
|
+
* @param tileSize - Tile width and height. Default: 256. Use 0 for strip-based.
|
|
105
|
+
*/
|
|
106
|
+
export declare function makeImageTags(width: number, height: number, bitsPerSample: number, sampleFormat: number, compression?: "none" | "deflate", imageDescription?: string, isSubResolution?: boolean, tileSize?: number): TiffTag[];
|
|
107
|
+
/**
|
|
108
|
+
* Slice a 2D pixel plane into tiles suitable for TIFF tiled output.
|
|
109
|
+
*
|
|
110
|
+
* Tiles that extend beyond the image boundary are zero-padded to the
|
|
111
|
+
* full tile size (required by the TIFF spec for tiled images).
|
|
112
|
+
*
|
|
113
|
+
* @param planeBytes - Raw pixel data for the entire plane (row-major, little-endian).
|
|
114
|
+
* @param width - Image width in pixels.
|
|
115
|
+
* @param height - Image height in pixels.
|
|
116
|
+
* @param bytesPerPixel - Bytes per pixel (e.g. 2 for uint16).
|
|
117
|
+
* @param tileW - Tile width in pixels.
|
|
118
|
+
* @param tileH - Tile height in pixels.
|
|
119
|
+
* @returns Array of tile buffers, in row-major tile order (left-to-right, top-to-bottom).
|
|
120
|
+
*/
|
|
121
|
+
export declare function sliceTiles(planeBytes: Uint8Array, width: number, height: number, bytesPerPixel: number, tileW: number, tileH: number): Uint8Array[];
|
|
65
122
|
//# sourceMappingURL=tiff-writer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tiff-writer.d.ts","sourceRoot":"","sources":["../src/tiff-writer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tiff-writer.d.ts","sourceRoot":"","sources":["../src/tiff-writer.ts"],"names":[],"mappings":"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"}
|
package/dist/tiff-writer.js
CHANGED
|
@@ -3,20 +3,28 @@
|
|
|
3
3
|
/**
|
|
4
4
|
* Low-level TIFF binary builder.
|
|
5
5
|
*
|
|
6
|
-
* Assembles IFD entries, tag values, strip data, and SubIFD chains into
|
|
7
|
-
* a valid
|
|
6
|
+
* Assembles IFD entries, tag values, tile/strip data, and SubIFD chains into
|
|
7
|
+
* a valid TIFF file (little-endian). Supports both classic TIFF (32-bit
|
|
8
|
+
* offsets, magic 42) and BigTIFF (64-bit offsets, magic 43).
|
|
9
|
+
*
|
|
10
|
+
* Features:
|
|
11
|
+
* - Tiled output (default 256x256, configurable)
|
|
12
|
+
* - Deflate compression via CompressionStream (async, non-blocking)
|
|
13
|
+
* with synchronous pako fallback
|
|
14
|
+
* - Automatic BigTIFF when offsets exceed 4 GB
|
|
15
|
+
* - Compress-and-release: tiles are compressed eagerly, uncompressed
|
|
16
|
+
* data is released immediately to minimise peak memory
|
|
8
17
|
*
|
|
9
18
|
* Layout strategy (two-pass):
|
|
10
|
-
* Pass 1:
|
|
11
|
-
* Pass 2:
|
|
19
|
+
* Pass 1: Compress tiles, resolve tags, compute sizes and offsets.
|
|
20
|
+
* Pass 2: Write into a pre-allocated ArrayBuffer.
|
|
12
21
|
*
|
|
13
22
|
* File layout:
|
|
14
|
-
* [Header 8 bytes]
|
|
15
|
-
* [Main IFD 0 entries + overflow data +
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* [
|
|
19
|
-
* [SubIFD 0,1 entries + overflow data + strip data]
|
|
23
|
+
* [Header 8 or 16 bytes]
|
|
24
|
+
* [Main IFD 0 entries + overflow data + tile data]
|
|
25
|
+
* [SubIFD 0,0 ...]
|
|
26
|
+
* [SubIFD 0,1 ...]
|
|
27
|
+
* [Main IFD 1 entries + overflow data + tile data]
|
|
20
28
|
* ...
|
|
21
29
|
*/
|
|
22
30
|
import { deflate } from "pako";
|
|
@@ -27,12 +35,14 @@ export const TIFF_TYPE_ASCII = 2; // 1 byte (null-terminated)
|
|
|
27
35
|
export const TIFF_TYPE_SHORT = 3; // 2 bytes
|
|
28
36
|
export const TIFF_TYPE_LONG = 4; // 4 bytes
|
|
29
37
|
export const TIFF_TYPE_RATIONAL = 5; // 8 bytes (two LONGs)
|
|
38
|
+
export const TIFF_TYPE_LONG8 = 16; // 8 bytes (BigTIFF only)
|
|
30
39
|
const TYPE_SIZES = {
|
|
31
40
|
[TIFF_TYPE_BYTE]: 1,
|
|
32
41
|
[TIFF_TYPE_ASCII]: 1,
|
|
33
42
|
[TIFF_TYPE_SHORT]: 2,
|
|
34
43
|
[TIFF_TYPE_LONG]: 4,
|
|
35
44
|
[TIFF_TYPE_RATIONAL]: 8,
|
|
45
|
+
[TIFF_TYPE_LONG8]: 8,
|
|
36
46
|
};
|
|
37
47
|
/** Well-known TIFF tags. */
|
|
38
48
|
export const TAG_NEW_SUBFILE_TYPE = 254;
|
|
@@ -47,58 +57,144 @@ export const TAG_SAMPLES_PER_PIXEL = 277;
|
|
|
47
57
|
export const TAG_ROWS_PER_STRIP = 278;
|
|
48
58
|
export const TAG_STRIP_BYTE_COUNTS = 279;
|
|
49
59
|
export const TAG_PLANAR_CONFIGURATION = 284;
|
|
50
|
-
export const
|
|
60
|
+
export const TAG_TILE_WIDTH = 322;
|
|
61
|
+
export const TAG_TILE_LENGTH = 323;
|
|
62
|
+
export const TAG_TILE_OFFSETS = 324;
|
|
63
|
+
export const TAG_TILE_BYTE_COUNTS = 325;
|
|
51
64
|
export const TAG_SUB_IFDS = 330;
|
|
65
|
+
export const TAG_SAMPLE_FORMAT = 339;
|
|
52
66
|
/** TIFF compression codes. */
|
|
53
67
|
export const COMPRESSION_NONE = 1;
|
|
54
68
|
export const COMPRESSION_DEFLATE = 8;
|
|
69
|
+
/** Default tile size (OME-TIFF convention). Must be a multiple of 16. */
|
|
70
|
+
export const DEFAULT_TILE_SIZE = 256;
|
|
71
|
+
const CLASSIC_FORMAT = {
|
|
72
|
+
headerSize: 8,
|
|
73
|
+
ifdEntrySize: 12,
|
|
74
|
+
offsetSize: 4,
|
|
75
|
+
inlineThreshold: 4,
|
|
76
|
+
offsetType: TIFF_TYPE_LONG,
|
|
77
|
+
magic: 42,
|
|
78
|
+
};
|
|
79
|
+
const BIGTIFF_FORMAT = {
|
|
80
|
+
headerSize: 16,
|
|
81
|
+
ifdEntrySize: 20,
|
|
82
|
+
offsetSize: 8,
|
|
83
|
+
inlineThreshold: 8,
|
|
84
|
+
offsetType: TIFF_TYPE_LONG8,
|
|
85
|
+
magic: 43,
|
|
86
|
+
};
|
|
55
87
|
// ── Public API ──────────────────────────────────────────────────────
|
|
56
88
|
/**
|
|
57
89
|
* Build a complete TIFF file from a list of IFDs.
|
|
58
90
|
*
|
|
91
|
+
* Tiles are compressed (if requested) eagerly and in parallel where
|
|
92
|
+
* possible. The uncompressed data is released after compression to
|
|
93
|
+
* minimise peak memory usage.
|
|
94
|
+
*
|
|
59
95
|
* @param ifds - Main IFD chain (linked via next-IFD pointers).
|
|
60
|
-
* @param options - Build options (compression, etc.).
|
|
96
|
+
* @param options - Build options (compression, format, etc.).
|
|
61
97
|
* @returns A complete TIFF file as an ArrayBuffer.
|
|
62
98
|
*/
|
|
63
|
-
export function buildTiff(ifds, options = {}) {
|
|
99
|
+
export async function buildTiff(ifds, options = {}) {
|
|
64
100
|
const compression = options.compression ?? "none";
|
|
65
101
|
const compressionLevel = options.compressionLevel ?? 6;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
102
|
+
const formatOpt = options.format ?? "auto";
|
|
103
|
+
// Phase 1: Compress tiles eagerly (compress-and-release)
|
|
104
|
+
const processedIfds = await Promise.all(ifds.map((ifd) => processIfdAsync(ifd, compression, compressionLevel)));
|
|
105
|
+
// Phase 2: Determine format (auto-detect BigTIFF if needed)
|
|
106
|
+
const rawSize = estimateRawSize(processedIfds);
|
|
107
|
+
let fmt;
|
|
108
|
+
if (formatOpt === "bigtiff") {
|
|
109
|
+
fmt = BIGTIFF_FORMAT;
|
|
110
|
+
}
|
|
111
|
+
else if (formatOpt === "classic") {
|
|
112
|
+
fmt = CLASSIC_FORMAT;
|
|
113
|
+
if (rawSize > 0xffff_fffe) {
|
|
114
|
+
throw new Error(`File size (~${(rawSize / 1e9).toFixed(1)} GB) exceeds classic TIFF 4 GB limit. ` +
|
|
115
|
+
`Use format: "auto" or "bigtiff".`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
// auto: use BigTIFF if estimated size > 3.9 GB (conservative)
|
|
120
|
+
fmt = rawSize > 3.9e9 ? BIGTIFF_FORMAT : CLASSIC_FORMAT;
|
|
121
|
+
}
|
|
122
|
+
// Phase 3: Compute sizes and place all IFDs
|
|
123
|
+
const placed = placeIfds(processedIfds, fmt);
|
|
124
|
+
// Phase 4: Compute total file size
|
|
125
|
+
const totalSize = computeTotalSize(placed, fmt);
|
|
126
|
+
// Phase 5: Write into buffer
|
|
73
127
|
const buffer = new ArrayBuffer(totalSize);
|
|
74
128
|
const view = new DataView(buffer);
|
|
75
|
-
|
|
76
|
-
view.setUint16(0, 0x4949, true); // "II" byte order
|
|
77
|
-
view.setUint16(2, 42, true); // magic number
|
|
78
|
-
view.setUint32(4, placed.length > 0 ? placed[0].ifdOffset : 0, true); // offset to first IFD
|
|
79
|
-
// Write all placed IFDs
|
|
129
|
+
writeHeader(view, fmt, placed.length > 0 ? placed[0].ifdOffset : 0);
|
|
80
130
|
for (const p of placed) {
|
|
81
|
-
writeIfd(view, buffer, p);
|
|
131
|
+
writeIfd(view, buffer, p, fmt);
|
|
82
132
|
}
|
|
83
133
|
return buffer;
|
|
84
134
|
}
|
|
85
135
|
/**
|
|
86
136
|
* Compress a Uint8Array using deflate (zlib-wrapped, RFC 1950).
|
|
87
137
|
* Compatible with TIFF compression code 8 and geotiff.js's pako.inflate().
|
|
138
|
+
*
|
|
139
|
+
* Prefers the native CompressionStream API (async, non-blocking) when
|
|
140
|
+
* available, falling back to synchronous pako.deflate().
|
|
141
|
+
*/
|
|
142
|
+
export async function compressDeflateAsync(data, level = 6) {
|
|
143
|
+
// CompressionStream("deflate") produces zlib-wrapped output (RFC 1950),
|
|
144
|
+
// which is what TIFF code 8 expects and what geotiff.js decompresses.
|
|
145
|
+
// However, CompressionStream doesn't support compression level, so we
|
|
146
|
+
// only use it for the default level to avoid surprising behaviour.
|
|
147
|
+
// For non-default levels, we fall back to pako.
|
|
148
|
+
if (typeof globalThis.CompressionStream !== "undefined" &&
|
|
149
|
+
level === 6) {
|
|
150
|
+
const stream = new CompressionStream("deflate");
|
|
151
|
+
const writer = stream.writable.getWriter();
|
|
152
|
+
const reader = stream.readable.getReader();
|
|
153
|
+
// Write and close
|
|
154
|
+
writer.write(data);
|
|
155
|
+
writer.close();
|
|
156
|
+
// Collect chunks
|
|
157
|
+
const chunks = [];
|
|
158
|
+
let totalLen = 0;
|
|
159
|
+
while (true) {
|
|
160
|
+
const { done, value } = await reader.read();
|
|
161
|
+
if (done)
|
|
162
|
+
break;
|
|
163
|
+
chunks.push(value);
|
|
164
|
+
totalLen += value.length;
|
|
165
|
+
}
|
|
166
|
+
// Concatenate
|
|
167
|
+
const result = new Uint8Array(totalLen);
|
|
168
|
+
let offset = 0;
|
|
169
|
+
for (const chunk of chunks) {
|
|
170
|
+
result.set(chunk, offset);
|
|
171
|
+
offset += chunk.length;
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
return compressDeflate(data, level);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Compress a Uint8Array using deflate (zlib-wrapped, RFC 1950) synchronously.
|
|
179
|
+
* Compatible with TIFF compression code 8 and geotiff.js's pako.inflate().
|
|
88
180
|
*/
|
|
89
181
|
export function compressDeflate(data, level = 6) {
|
|
90
182
|
return deflate(data, { level: level });
|
|
91
183
|
}
|
|
92
184
|
// ── Internal helpers ────────────────────────────────────────────────
|
|
93
185
|
/**
|
|
94
|
-
* Process an IFD: compress
|
|
95
|
-
* and recursively process SubIFDs.
|
|
186
|
+
* Process an IFD: compress tiles if needed, add compression tag,
|
|
187
|
+
* and recursively process SubIFDs. Async for CompressionStream support.
|
|
188
|
+
*
|
|
189
|
+
* This is the "compress-and-release" step: after compression, the
|
|
190
|
+
* original uncompressed tile data can be GC'd.
|
|
96
191
|
*/
|
|
97
|
-
function
|
|
98
|
-
let
|
|
192
|
+
async function processIfdAsync(ifd, compression, level) {
|
|
193
|
+
let tiles = ifd.tiles;
|
|
99
194
|
const tags = [...ifd.tags];
|
|
100
195
|
if (compression === "deflate") {
|
|
101
|
-
|
|
196
|
+
// Compress all tiles in parallel
|
|
197
|
+
tiles = await Promise.all(tiles.map((t) => compressDeflateAsync(t, level)));
|
|
102
198
|
// Replace or add Compression tag
|
|
103
199
|
const compIdx = tags.findIndex((t) => t.tag === TAG_COMPRESSION);
|
|
104
200
|
if (compIdx >= 0) {
|
|
@@ -108,8 +204,44 @@ function processIfd(ifd, compression, level) {
|
|
|
108
204
|
tags.push({ tag: TAG_COMPRESSION, type: TIFF_TYPE_SHORT, values: [COMPRESSION_DEFLATE] });
|
|
109
205
|
}
|
|
110
206
|
}
|
|
111
|
-
const subIfds = ifd.subIfds
|
|
112
|
-
|
|
207
|
+
const subIfds = ifd.subIfds
|
|
208
|
+
? await Promise.all(ifd.subIfds.map((sub) => processIfdAsync(sub, compression, level)))
|
|
209
|
+
: undefined;
|
|
210
|
+
return { tags, tiles, subIfds };
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Estimate raw file size (sum of all tile data + overhead per IFD).
|
|
214
|
+
* Used for BigTIFF auto-detection.
|
|
215
|
+
*/
|
|
216
|
+
function estimateRawSize(ifds) {
|
|
217
|
+
let size = 16; // BigTIFF header (conservative)
|
|
218
|
+
for (const ifd of ifds) {
|
|
219
|
+
size += 256; // tags overhead estimate
|
|
220
|
+
for (const tile of ifd.tiles) {
|
|
221
|
+
size += tile.length;
|
|
222
|
+
}
|
|
223
|
+
if (ifd.subIfds) {
|
|
224
|
+
size += estimateRawSize(ifd.subIfds);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
return size;
|
|
228
|
+
}
|
|
229
|
+
/** Write the TIFF file header. */
|
|
230
|
+
function writeHeader(view, fmt, firstIfdOffset) {
|
|
231
|
+
// Byte order: "II" (little-endian)
|
|
232
|
+
view.setUint16(0, 0x4949, true);
|
|
233
|
+
if (fmt.magic === 42) {
|
|
234
|
+
// Classic TIFF
|
|
235
|
+
view.setUint16(2, 42, true);
|
|
236
|
+
view.setUint32(4, firstIfdOffset, true);
|
|
237
|
+
}
|
|
238
|
+
else {
|
|
239
|
+
// BigTIFF
|
|
240
|
+
view.setUint16(2, 43, true);
|
|
241
|
+
view.setUint16(4, 8, true); // offset size
|
|
242
|
+
view.setUint16(6, 0, true); // padding
|
|
243
|
+
setBigUint64(view, 8, firstIfdOffset);
|
|
244
|
+
}
|
|
113
245
|
}
|
|
114
246
|
/** Resolve a TiffTag to its byte representation. */
|
|
115
247
|
function resolveTag(tag) {
|
|
@@ -141,6 +273,9 @@ function resolveTag(tag) {
|
|
|
141
273
|
case TIFF_TYPE_LONG:
|
|
142
274
|
dv.setUint32(i * 4, tag.values[i], true);
|
|
143
275
|
break;
|
|
276
|
+
case TIFF_TYPE_LONG8:
|
|
277
|
+
setBigUint64(dv, i * 8, tag.values[i]);
|
|
278
|
+
break;
|
|
144
279
|
case TIFF_TYPE_RATIONAL:
|
|
145
280
|
// Rationals are stored as two LONGs (numerator, denominator)
|
|
146
281
|
dv.setUint32(i * 4, tag.values[i], true);
|
|
@@ -150,17 +285,22 @@ function resolveTag(tag) {
|
|
|
150
285
|
return { tag: tag.tag, type: tag.type, count, valueBytes };
|
|
151
286
|
}
|
|
152
287
|
/**
|
|
153
|
-
* Compute the byte size of an IFD entry block
|
|
154
|
-
*
|
|
288
|
+
* Compute the byte size of an IFD entry block.
|
|
289
|
+
* Classic: 2 + 12*N + 4
|
|
290
|
+
* BigTIFF: 8 + 20*N + 8
|
|
155
291
|
*/
|
|
156
|
-
function ifdEntryBlockSize(numTags) {
|
|
157
|
-
|
|
292
|
+
function ifdEntryBlockSize(numTags, fmt) {
|
|
293
|
+
if (fmt.magic === 42) {
|
|
294
|
+
return 2 + numTags * 12 + 4;
|
|
295
|
+
}
|
|
296
|
+
// BigTIFF: 8 bytes entry count + 20 bytes per entry + 8 bytes next offset
|
|
297
|
+
return 8 + numTags * 20 + 8;
|
|
158
298
|
}
|
|
159
|
-
/** Compute overflow size for resolved tags (values that don't fit
|
|
160
|
-
function overflowSize(tags) {
|
|
299
|
+
/** Compute overflow size for resolved tags (values that don't fit inline). */
|
|
300
|
+
function overflowSize(tags, fmt) {
|
|
161
301
|
let size = 0;
|
|
162
302
|
for (const t of tags) {
|
|
163
|
-
if (t.valueBytes.length >
|
|
303
|
+
if (t.valueBytes.length > fmt.inlineThreshold) {
|
|
164
304
|
size += t.valueBytes.length;
|
|
165
305
|
// Pad to word boundary (2-byte alignment)
|
|
166
306
|
if (t.valueBytes.length % 2 !== 0)
|
|
@@ -169,48 +309,54 @@ function overflowSize(tags) {
|
|
|
169
309
|
}
|
|
170
310
|
return size;
|
|
171
311
|
}
|
|
172
|
-
/** Compute total
|
|
173
|
-
function
|
|
174
|
-
return
|
|
312
|
+
/** Compute total tile data size. */
|
|
313
|
+
function totalTileSize(tiles) {
|
|
314
|
+
return tiles.reduce((sum, t) => sum + t.length, 0);
|
|
175
315
|
}
|
|
176
316
|
/**
|
|
177
317
|
* Place all IFDs sequentially, computing absolute offsets.
|
|
178
|
-
* Returns a flat list of PlacedIfds (main chain first, then SubIFDs).
|
|
318
|
+
* Returns a flat list of PlacedIfds (main chain first, then SubIFDs interleaved).
|
|
179
319
|
*/
|
|
180
|
-
function placeIfds(ifds) {
|
|
320
|
+
function placeIfds(ifds, fmt) {
|
|
181
321
|
const allPlaced = [];
|
|
182
322
|
function resolveIfdInfo(ifd) {
|
|
183
|
-
// Build tags list — we'll add StripOffsets and StripByteCounts as placeholders
|
|
184
|
-
// They'll be patched during the write phase
|
|
185
323
|
const userTags = ifd.tags.map(resolveTag);
|
|
186
|
-
//
|
|
187
|
-
const
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
324
|
+
// Determine if this is tiled or stripped based on tags
|
|
325
|
+
const hasTileWidth = ifd.tags.some((t) => t.tag === TAG_TILE_WIDTH);
|
|
326
|
+
// Add offset and byte-count tags as placeholders
|
|
327
|
+
const offsetTag = hasTileWidth ? TAG_TILE_OFFSETS : TAG_STRIP_OFFSETS;
|
|
328
|
+
const countTag = hasTileWidth ? TAG_TILE_BYTE_COUNTS : TAG_STRIP_BYTE_COUNTS;
|
|
329
|
+
const tileOffsetsTag = {
|
|
330
|
+
tag: offsetTag,
|
|
331
|
+
type: fmt.offsetType,
|
|
332
|
+
count: ifd.tiles.length,
|
|
333
|
+
valueBytes: new Uint8Array(ifd.tiles.length * fmt.offsetSize),
|
|
192
334
|
};
|
|
193
|
-
|
|
194
|
-
const
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
335
|
+
const tileByteCountsBytes = new Uint8Array(ifd.tiles.length * fmt.offsetSize);
|
|
336
|
+
const tbcView = new DataView(tileByteCountsBytes.buffer);
|
|
337
|
+
for (let i = 0; i < ifd.tiles.length; i++) {
|
|
338
|
+
if (fmt.offsetSize === 8) {
|
|
339
|
+
setBigUint64(tbcView, i * 8, ifd.tiles[i].length);
|
|
340
|
+
}
|
|
341
|
+
else {
|
|
342
|
+
tbcView.setUint32(i * 4, ifd.tiles[i].length, true);
|
|
343
|
+
}
|
|
198
344
|
}
|
|
199
|
-
const
|
|
200
|
-
tag:
|
|
201
|
-
type:
|
|
202
|
-
count: ifd.
|
|
203
|
-
valueBytes:
|
|
345
|
+
const tileByteCountsTag = {
|
|
346
|
+
tag: countTag,
|
|
347
|
+
type: fmt.offsetType,
|
|
348
|
+
count: ifd.tiles.length,
|
|
349
|
+
valueBytes: tileByteCountsBytes,
|
|
204
350
|
};
|
|
205
|
-
const allTags = [...userTags,
|
|
351
|
+
const allTags = [...userTags, tileOffsetsTag, tileByteCountsTag];
|
|
206
352
|
// Add SubIFDs tag if there are SubIFDs
|
|
207
353
|
const subIfdInfos = (ifd.subIfds ?? []).map(resolveIfdInfo);
|
|
208
354
|
if (subIfdInfos.length > 0) {
|
|
209
355
|
const subIfdsTag = {
|
|
210
356
|
tag: TAG_SUB_IFDS,
|
|
211
|
-
type:
|
|
357
|
+
type: fmt.offsetType,
|
|
212
358
|
count: subIfdInfos.length,
|
|
213
|
-
valueBytes: new Uint8Array(subIfdInfos.length *
|
|
359
|
+
valueBytes: new Uint8Array(subIfdInfos.length * fmt.offsetSize),
|
|
214
360
|
};
|
|
215
361
|
allTags.push(subIfdsTag);
|
|
216
362
|
}
|
|
@@ -218,42 +364,41 @@ function placeIfds(ifds) {
|
|
|
218
364
|
allTags.sort((a, b) => a.tag - b.tag);
|
|
219
365
|
return {
|
|
220
366
|
tags: allTags,
|
|
221
|
-
|
|
367
|
+
tiles: ifd.tiles,
|
|
222
368
|
subIfdInfos,
|
|
223
|
-
entryBlockSize: ifdEntryBlockSize(allTags.length),
|
|
224
|
-
overflow: overflowSize(allTags),
|
|
225
|
-
|
|
369
|
+
entryBlockSize: ifdEntryBlockSize(allTags.length, fmt),
|
|
370
|
+
overflow: overflowSize(allTags, fmt),
|
|
371
|
+
tileSize: totalTileSize(ifd.tiles),
|
|
226
372
|
};
|
|
227
373
|
}
|
|
228
374
|
const mainInfos = ifds.map(resolveIfdInfo);
|
|
229
|
-
//
|
|
230
|
-
let cursor =
|
|
375
|
+
// Place IFDs sequentially
|
|
376
|
+
let cursor = fmt.headerSize;
|
|
231
377
|
function placeIfdInfo(info) {
|
|
232
378
|
const ifdOffset = cursor;
|
|
233
379
|
cursor += info.entryBlockSize;
|
|
234
380
|
const overflowOffset = cursor;
|
|
235
381
|
cursor += info.overflow;
|
|
236
|
-
const
|
|
237
|
-
cursor += info.
|
|
382
|
+
const tileDataOffset = cursor;
|
|
383
|
+
cursor += info.tileSize;
|
|
238
384
|
const placed = {
|
|
239
385
|
ifdOffset,
|
|
240
386
|
tags: info.tags,
|
|
241
387
|
overflowOffset,
|
|
242
388
|
overflowSize: info.overflow,
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
subIfds: [],
|
|
246
|
-
nextIfdOffset: 0,
|
|
389
|
+
tileDataOffset,
|
|
390
|
+
tiles: info.tiles,
|
|
391
|
+
subIfds: [],
|
|
392
|
+
nextIfdOffset: 0,
|
|
247
393
|
};
|
|
248
394
|
info.placed = placed;
|
|
249
395
|
allPlaced.push(placed);
|
|
250
|
-
// Place SubIFDs immediately after this IFD's
|
|
396
|
+
// Place SubIFDs immediately after this IFD's tile data
|
|
251
397
|
for (const subInfo of info.subIfdInfos) {
|
|
252
398
|
placed.subIfds.push(placeIfdInfo(subInfo));
|
|
253
399
|
}
|
|
254
400
|
return placed;
|
|
255
401
|
}
|
|
256
|
-
// Place main chain IFDs (SubIFDs are placed within each main IFD's placeIfdInfo call)
|
|
257
402
|
const mainPlaced = [];
|
|
258
403
|
for (let i = 0; i < mainInfos.length; i++) {
|
|
259
404
|
mainPlaced.push(placeIfdInfo(mainInfos[i]));
|
|
@@ -265,66 +410,112 @@ function placeIfds(ifds) {
|
|
|
265
410
|
return allPlaced;
|
|
266
411
|
}
|
|
267
412
|
/** Compute total file size from placed IFDs. */
|
|
268
|
-
function computeTotalSize(placed) {
|
|
413
|
+
function computeTotalSize(placed, fmt) {
|
|
269
414
|
if (placed.length === 0)
|
|
270
|
-
return
|
|
271
|
-
let maxEnd =
|
|
415
|
+
return fmt.headerSize;
|
|
416
|
+
let maxEnd = fmt.headerSize;
|
|
272
417
|
for (const p of placed) {
|
|
273
|
-
const end = p.
|
|
418
|
+
const end = p.tileDataOffset + totalTileSize(p.tiles);
|
|
274
419
|
if (end > maxEnd)
|
|
275
420
|
maxEnd = end;
|
|
276
421
|
}
|
|
277
422
|
return maxEnd;
|
|
278
423
|
}
|
|
279
|
-
/** Write a single placed IFD
|
|
280
|
-
function writeIfd(view, buffer, placed) {
|
|
424
|
+
/** Write a single placed IFD into the buffer. */
|
|
425
|
+
function writeIfd(view, buffer, placed, fmt) {
|
|
281
426
|
let pos = placed.ifdOffset;
|
|
427
|
+
const isBig = fmt.magic === 43;
|
|
282
428
|
// Write entry count
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
429
|
+
if (isBig) {
|
|
430
|
+
setBigUint64(view, pos, placed.tags.length);
|
|
431
|
+
pos += 8;
|
|
432
|
+
}
|
|
433
|
+
else {
|
|
434
|
+
view.setUint16(pos, placed.tags.length, true);
|
|
435
|
+
pos += 2;
|
|
436
|
+
}
|
|
437
|
+
// Compute tile offsets for this IFD
|
|
438
|
+
const tileOffsets = [];
|
|
439
|
+
let tileCursor = placed.tileDataOffset;
|
|
440
|
+
for (const tile of placed.tiles) {
|
|
441
|
+
tileOffsets.push(tileCursor);
|
|
442
|
+
tileCursor += tile.length;
|
|
291
443
|
}
|
|
292
444
|
// Compute SubIFD offsets
|
|
293
445
|
const subIfdOffsets = placed.subIfds.map((s) => s.ifdOffset);
|
|
294
446
|
// Track overflow cursor
|
|
295
447
|
let overflowCursor = placed.overflowOffset;
|
|
296
|
-
//
|
|
448
|
+
// Determine which offset/bytecount tag numbers are in play
|
|
449
|
+
const isOffsetTag = (t) => t === TAG_TILE_OFFSETS || t === TAG_STRIP_OFFSETS;
|
|
450
|
+
const isByteCountTag = (t) => t === TAG_TILE_BYTE_COUNTS || t === TAG_STRIP_BYTE_COUNTS;
|
|
451
|
+
// Write each tag entry
|
|
297
452
|
for (const tag of placed.tags) {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
453
|
+
if (isBig) {
|
|
454
|
+
view.setUint16(pos, tag.tag, true);
|
|
455
|
+
view.setUint16(pos + 2, tag.type, true);
|
|
456
|
+
setBigUint64(view, pos + 4, tag.count);
|
|
457
|
+
}
|
|
458
|
+
else {
|
|
459
|
+
view.setUint16(pos, tag.tag, true);
|
|
460
|
+
view.setUint16(pos + 2, tag.type, true);
|
|
461
|
+
view.setUint32(pos + 4, tag.count, true);
|
|
462
|
+
}
|
|
463
|
+
const valueFieldOffset = isBig ? pos + 12 : pos + 8;
|
|
301
464
|
// Determine the value bytes to write
|
|
302
465
|
let valueBytes = tag.valueBytes;
|
|
303
|
-
// Patch
|
|
304
|
-
if (tag.tag
|
|
305
|
-
valueBytes = new Uint8Array(
|
|
466
|
+
// Patch offset tags
|
|
467
|
+
if (isOffsetTag(tag.tag)) {
|
|
468
|
+
valueBytes = new Uint8Array(tileOffsets.length * fmt.offsetSize);
|
|
306
469
|
const dv = new DataView(valueBytes.buffer, valueBytes.byteOffset, valueBytes.byteLength);
|
|
307
|
-
for (let i = 0; i <
|
|
308
|
-
|
|
470
|
+
for (let i = 0; i < tileOffsets.length; i++) {
|
|
471
|
+
if (fmt.offsetSize === 8) {
|
|
472
|
+
setBigUint64(dv, i * 8, tileOffsets[i]);
|
|
473
|
+
}
|
|
474
|
+
else {
|
|
475
|
+
dv.setUint32(i * 4, tileOffsets[i], true);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
// Patch byte count tags — recompute from actual tile sizes
|
|
480
|
+
if (isByteCountTag(tag.tag)) {
|
|
481
|
+
valueBytes = new Uint8Array(placed.tiles.length * fmt.offsetSize);
|
|
482
|
+
const dv = new DataView(valueBytes.buffer, valueBytes.byteOffset, valueBytes.byteLength);
|
|
483
|
+
for (let i = 0; i < placed.tiles.length; i++) {
|
|
484
|
+
if (fmt.offsetSize === 8) {
|
|
485
|
+
setBigUint64(dv, i * 8, placed.tiles[i].length);
|
|
486
|
+
}
|
|
487
|
+
else {
|
|
488
|
+
dv.setUint32(i * 4, placed.tiles[i].length, true);
|
|
489
|
+
}
|
|
309
490
|
}
|
|
310
491
|
}
|
|
311
492
|
// Patch SubIFDs offsets
|
|
312
493
|
if (tag.tag === TAG_SUB_IFDS && subIfdOffsets.length > 0) {
|
|
313
|
-
valueBytes = new Uint8Array(subIfdOffsets.length *
|
|
494
|
+
valueBytes = new Uint8Array(subIfdOffsets.length * fmt.offsetSize);
|
|
314
495
|
const dv = new DataView(valueBytes.buffer, valueBytes.byteOffset, valueBytes.byteLength);
|
|
315
496
|
for (let i = 0; i < subIfdOffsets.length; i++) {
|
|
316
|
-
|
|
497
|
+
if (fmt.offsetSize === 8) {
|
|
498
|
+
setBigUint64(dv, i * 8, subIfdOffsets[i]);
|
|
499
|
+
}
|
|
500
|
+
else {
|
|
501
|
+
dv.setUint32(i * 4, subIfdOffsets[i], true);
|
|
502
|
+
}
|
|
317
503
|
}
|
|
318
504
|
}
|
|
319
|
-
if (valueBytes.length <=
|
|
320
|
-
// Inline: write value bytes directly in the
|
|
321
|
-
const dest = new Uint8Array(buffer,
|
|
505
|
+
if (valueBytes.length <= fmt.inlineThreshold) {
|
|
506
|
+
// Inline: write value bytes directly in the value/offset field
|
|
507
|
+
const dest = new Uint8Array(buffer, valueFieldOffset, fmt.inlineThreshold);
|
|
322
508
|
dest.fill(0);
|
|
323
509
|
dest.set(valueBytes);
|
|
324
510
|
}
|
|
325
511
|
else {
|
|
326
512
|
// Overflow: write offset to overflow area, then write bytes there
|
|
327
|
-
|
|
513
|
+
if (fmt.offsetSize === 8) {
|
|
514
|
+
setBigUint64(view, valueFieldOffset, overflowCursor);
|
|
515
|
+
}
|
|
516
|
+
else {
|
|
517
|
+
view.setUint32(valueFieldOffset, overflowCursor, true);
|
|
518
|
+
}
|
|
328
519
|
const dest = new Uint8Array(buffer, overflowCursor, valueBytes.length);
|
|
329
520
|
dest.set(valueBytes);
|
|
330
521
|
overflowCursor += valueBytes.length;
|
|
@@ -332,22 +523,37 @@ function writeIfd(view, buffer, placed) {
|
|
|
332
523
|
if (valueBytes.length % 2 !== 0)
|
|
333
524
|
overflowCursor += 1;
|
|
334
525
|
}
|
|
335
|
-
pos +=
|
|
526
|
+
pos += fmt.ifdEntrySize;
|
|
336
527
|
}
|
|
337
528
|
// Write next IFD offset
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
529
|
+
if (isBig) {
|
|
530
|
+
setBigUint64(view, pos, placed.nextIfdOffset);
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
533
|
+
view.setUint32(pos, placed.nextIfdOffset, true);
|
|
534
|
+
}
|
|
535
|
+
// Write tile data
|
|
536
|
+
let tilePos = placed.tileDataOffset;
|
|
537
|
+
for (const tile of placed.tiles) {
|
|
538
|
+
const dest = new Uint8Array(buffer, tilePos, tile.length);
|
|
539
|
+
dest.set(tile);
|
|
540
|
+
tilePos += tile.length;
|
|
345
541
|
}
|
|
346
|
-
// SubIFDs are already in allPlaced and will be written by the caller's loop
|
|
347
542
|
}
|
|
348
543
|
// ── Convenience helpers for building IFD tags ───────────────────────
|
|
349
|
-
/**
|
|
350
|
-
|
|
544
|
+
/**
|
|
545
|
+
* Create a standard set of tags for a tiled grayscale image plane.
|
|
546
|
+
*
|
|
547
|
+
* @param width - Image width in pixels.
|
|
548
|
+
* @param height - Image height in pixels.
|
|
549
|
+
* @param bitsPerSample - Bits per sample (8, 16, 32, 64).
|
|
550
|
+
* @param sampleFormat - TIFF SampleFormat (1=uint, 2=int, 3=float).
|
|
551
|
+
* @param compression - Compression type. Default: "none".
|
|
552
|
+
* @param imageDescription - Optional OME-XML string for the first IFD.
|
|
553
|
+
* @param isSubResolution - Whether this is a SubIFD (sets NewSubfileType=1).
|
|
554
|
+
* @param tileSize - Tile width and height. Default: 256. Use 0 for strip-based.
|
|
555
|
+
*/
|
|
556
|
+
export function makeImageTags(width, height, bitsPerSample, sampleFormat, compression = "none", imageDescription, isSubResolution, tileSize = DEFAULT_TILE_SIZE) {
|
|
351
557
|
const tags = [];
|
|
352
558
|
if (isSubResolution) {
|
|
353
559
|
tags.push({ tag: TAG_NEW_SUBFILE_TYPE, type: TIFF_TYPE_LONG, values: [1] });
|
|
@@ -362,12 +568,73 @@ export function makeImageTags(width, height, bitsPerSample, sampleFormat, compre
|
|
|
362
568
|
});
|
|
363
569
|
tags.push({ tag: TAG_PHOTOMETRIC, type: TIFF_TYPE_SHORT, values: [1] }); // MinIsBlack
|
|
364
570
|
tags.push({ tag: TAG_SAMPLES_PER_PIXEL, type: TIFF_TYPE_SHORT, values: [1] });
|
|
365
|
-
tags.push({ tag: TAG_ROWS_PER_STRIP, type: TIFF_TYPE_LONG, values: [height] }); // single strip
|
|
366
571
|
tags.push({ tag: TAG_PLANAR_CONFIGURATION, type: TIFF_TYPE_SHORT, values: [1] }); // chunky
|
|
367
572
|
tags.push({ tag: TAG_SAMPLE_FORMAT, type: TIFF_TYPE_SHORT, values: [sampleFormat] });
|
|
573
|
+
if (tileSize > 0 && (width > tileSize || height > tileSize)) {
|
|
574
|
+
// Tiled layout
|
|
575
|
+
tags.push({ tag: TAG_TILE_WIDTH, type: TIFF_TYPE_LONG, values: [tileSize] });
|
|
576
|
+
tags.push({ tag: TAG_TILE_LENGTH, type: TIFF_TYPE_LONG, values: [tileSize] });
|
|
577
|
+
}
|
|
578
|
+
else {
|
|
579
|
+
// Strip layout (single strip = entire plane) for small images
|
|
580
|
+
tags.push({ tag: TAG_ROWS_PER_STRIP, type: TIFF_TYPE_LONG, values: [height] });
|
|
581
|
+
}
|
|
368
582
|
if (imageDescription) {
|
|
369
583
|
tags.push({ tag: TAG_IMAGE_DESCRIPTION, type: TIFF_TYPE_ASCII, values: imageDescription });
|
|
370
584
|
}
|
|
371
585
|
return tags;
|
|
372
586
|
}
|
|
587
|
+
/**
|
|
588
|
+
* Slice a 2D pixel plane into tiles suitable for TIFF tiled output.
|
|
589
|
+
*
|
|
590
|
+
* Tiles that extend beyond the image boundary are zero-padded to the
|
|
591
|
+
* full tile size (required by the TIFF spec for tiled images).
|
|
592
|
+
*
|
|
593
|
+
* @param planeBytes - Raw pixel data for the entire plane (row-major, little-endian).
|
|
594
|
+
* @param width - Image width in pixels.
|
|
595
|
+
* @param height - Image height in pixels.
|
|
596
|
+
* @param bytesPerPixel - Bytes per pixel (e.g. 2 for uint16).
|
|
597
|
+
* @param tileW - Tile width in pixels.
|
|
598
|
+
* @param tileH - Tile height in pixels.
|
|
599
|
+
* @returns Array of tile buffers, in row-major tile order (left-to-right, top-to-bottom).
|
|
600
|
+
*/
|
|
601
|
+
export function sliceTiles(planeBytes, width, height, bytesPerPixel, tileW, tileH) {
|
|
602
|
+
const tilesX = Math.ceil(width / tileW);
|
|
603
|
+
const tilesY = Math.ceil(height / tileH);
|
|
604
|
+
const tiles = [];
|
|
605
|
+
const rowBytes = width * bytesPerPixel;
|
|
606
|
+
const tileRowBytes = tileW * bytesPerPixel;
|
|
607
|
+
const tileBytes = tileW * tileH * bytesPerPixel;
|
|
608
|
+
for (let ty = 0; ty < tilesY; ty++) {
|
|
609
|
+
for (let tx = 0; tx < tilesX; tx++) {
|
|
610
|
+
const tile = new Uint8Array(tileBytes); // zero-filled (handles padding)
|
|
611
|
+
const startY = ty * tileH;
|
|
612
|
+
const startX = tx * tileW;
|
|
613
|
+
// Number of valid rows/cols in this tile
|
|
614
|
+
const validRows = Math.min(tileH, height - startY);
|
|
615
|
+
const validCols = Math.min(tileW, width - startX);
|
|
616
|
+
const validRowBytes = validCols * bytesPerPixel;
|
|
617
|
+
for (let row = 0; row < validRows; row++) {
|
|
618
|
+
const srcOffset = (startY + row) * rowBytes + startX * bytesPerPixel;
|
|
619
|
+
const dstOffset = row * tileRowBytes;
|
|
620
|
+
tile.set(planeBytes.subarray(srcOffset, srcOffset + validRowBytes), dstOffset);
|
|
621
|
+
}
|
|
622
|
+
tiles.push(tile);
|
|
623
|
+
}
|
|
624
|
+
}
|
|
625
|
+
return tiles;
|
|
626
|
+
}
|
|
627
|
+
// ── BigTIFF helpers ─────────────────────────────────────────────────
|
|
628
|
+
/**
|
|
629
|
+
* Write a 64-bit unsigned integer to a DataView at the given offset.
|
|
630
|
+
* Uses two 32-bit writes since DataView.setBigUint64 may not be
|
|
631
|
+
* available in all environments.
|
|
632
|
+
*/
|
|
633
|
+
function setBigUint64(view, offset, value) {
|
|
634
|
+
// Split into low 32 bits and high 32 bits (little-endian)
|
|
635
|
+
const lo = value >>> 0;
|
|
636
|
+
const hi = (value / 0x1_0000_0000) >>> 0;
|
|
637
|
+
view.setUint32(offset, lo, true);
|
|
638
|
+
view.setUint32(offset + 4, hi, true);
|
|
639
|
+
}
|
|
373
640
|
//# sourceMappingURL=tiff-writer.js.map
|
package/dist/tiff-writer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tiff-writer.js","sourceRoot":"","sources":["../src/tiff-writer.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tiff-writer.js","sourceRoot":"","sources":["../src/tiff-writer.ts"],"names":[],"mappings":"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"}
|
package/dist/write.d.ts
CHANGED
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
* High-level OME-TIFF writer.
|
|
3
3
|
*
|
|
4
4
|
* Converts an ngff-zarr Multiscales object to a complete OME-TIFF file
|
|
5
|
-
* as an ArrayBuffer. Supports multi-resolution pyramids (via SubIFDs)
|
|
6
|
-
*
|
|
5
|
+
* as an ArrayBuffer. Supports multi-resolution pyramids (via SubIFDs),
|
|
6
|
+
* tiled output, deflate compression, parallel plane reading, and
|
|
7
|
+
* automatic BigTIFF detection.
|
|
7
8
|
*
|
|
8
9
|
* @example
|
|
9
10
|
* ```ts
|
|
@@ -41,6 +42,28 @@ export interface WriteOptions {
|
|
|
41
42
|
creator?: string;
|
|
42
43
|
/** Image name. Falls back to multiscales.metadata.name or "image". */
|
|
43
44
|
imageName?: string;
|
|
45
|
+
/**
|
|
46
|
+
* Tile size in pixels. Images larger than this in either dimension
|
|
47
|
+
* will use tiled output. Must be a multiple of 16.
|
|
48
|
+
* Default: 256 (OME-TIFF convention).
|
|
49
|
+
* Set to 0 to disable tiling (strip-based output).
|
|
50
|
+
*/
|
|
51
|
+
tileSize?: number;
|
|
52
|
+
/**
|
|
53
|
+
* Maximum number of planes to read concurrently.
|
|
54
|
+
* Higher values use more memory but can speed up writes when
|
|
55
|
+
* reading from async data sources.
|
|
56
|
+
* Default: 4.
|
|
57
|
+
*/
|
|
58
|
+
concurrency?: number;
|
|
59
|
+
/**
|
|
60
|
+
* TIFF format to use.
|
|
61
|
+
* - "auto": Classic TIFF when possible, BigTIFF for files > 4 GB.
|
|
62
|
+
* - "classic": Force classic TIFF (fails if file > 4 GB).
|
|
63
|
+
* - "bigtiff": Force BigTIFF (64-bit offsets).
|
|
64
|
+
* Default: "auto".
|
|
65
|
+
*/
|
|
66
|
+
format?: "auto" | "classic" | "bigtiff";
|
|
44
67
|
}
|
|
45
68
|
/**
|
|
46
69
|
* Convert an ngff-zarr Multiscales to an OME-TIFF ArrayBuffer.
|
|
@@ -50,6 +73,9 @@ export interface WriteOptions {
|
|
|
50
73
|
* level goes in the main IFD chain; lower-resolution levels
|
|
51
74
|
* are attached as SubIFDs to each corresponding main IFD.
|
|
52
75
|
*
|
|
76
|
+
* Planes are read with bounded concurrency and tiles are compressed
|
|
77
|
+
* eagerly to minimise peak memory.
|
|
78
|
+
*
|
|
53
79
|
* @param multiscales - The ngff-zarr Multiscales object to write.
|
|
54
80
|
* @param options - Writer options.
|
|
55
81
|
* @returns A complete OME-TIFF file as an ArrayBuffer.
|
package/dist/write.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAGA
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,wBAAwB,CAAC;AAerE,uCAAuC;AACvC,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EACX,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,GACP,OAAO,CAAC;IAEZ;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAEjC;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,+DAA+D;IAC/D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,sEAAsE;IACtE,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS,CAAC;CACzC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,SAAS,CAC7B,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAuFtB"}
|
package/dist/write.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import * as zarr from "zarrita";
|
|
4
4
|
import { zarrToTiffDtype, bytesPerElement } from "./dtypes.js";
|
|
5
5
|
import { buildOmeXml, extractDimensions } from "./ome-xml-writer.js";
|
|
6
|
-
import { buildTiff, makeImageTags, } from "./tiff-writer.js";
|
|
6
|
+
import { buildTiff, makeImageTags, sliceTiles, DEFAULT_TILE_SIZE, } from "./tiff-writer.js";
|
|
7
7
|
/**
|
|
8
8
|
* Convert an ngff-zarr Multiscales to an OME-TIFF ArrayBuffer.
|
|
9
9
|
*
|
|
@@ -12,6 +12,9 @@ import { buildTiff, makeImageTags, } from "./tiff-writer.js";
|
|
|
12
12
|
* level goes in the main IFD chain; lower-resolution levels
|
|
13
13
|
* are attached as SubIFDs to each corresponding main IFD.
|
|
14
14
|
*
|
|
15
|
+
* Planes are read with bounded concurrency and tiles are compressed
|
|
16
|
+
* eagerly to minimise peak memory.
|
|
17
|
+
*
|
|
15
18
|
* @param multiscales - The ngff-zarr Multiscales object to write.
|
|
16
19
|
* @param options - Writer options.
|
|
17
20
|
* @returns A complete OME-TIFF file as an ArrayBuffer.
|
|
@@ -20,6 +23,9 @@ export async function toOmeTiff(multiscales, options = {}) {
|
|
|
20
23
|
const dimensionOrder = options.dimensionOrder ?? "XYZCT";
|
|
21
24
|
const compression = options.compression ?? "deflate";
|
|
22
25
|
const compressionLevel = options.compressionLevel ?? 6;
|
|
26
|
+
const tileSize = options.tileSize ?? DEFAULT_TILE_SIZE;
|
|
27
|
+
const concurrency = options.concurrency ?? 4;
|
|
28
|
+
const format = options.format ?? "auto";
|
|
23
29
|
const fullResImage = multiscales.images[0];
|
|
24
30
|
const dtype = fullResImage.data.dtype;
|
|
25
31
|
const dims = extractDimensions(multiscales);
|
|
@@ -31,51 +37,59 @@ export async function toOmeTiff(multiscales, options = {}) {
|
|
|
31
37
|
creator: options.creator,
|
|
32
38
|
imageName: options.imageName,
|
|
33
39
|
});
|
|
34
|
-
// Build a pseudo OmePixels for IFD index computation
|
|
35
|
-
const pixels = {
|
|
36
|
-
dimensionOrder: dimensionOrder,
|
|
37
|
-
type: "",
|
|
38
|
-
sizeX: dims.sizeX,
|
|
39
|
-
sizeY: dims.sizeY,
|
|
40
|
-
sizeZ: dims.sizeZ,
|
|
41
|
-
sizeC: dims.sizeC,
|
|
42
|
-
sizeT: dims.sizeT,
|
|
43
|
-
bigEndian: false,
|
|
44
|
-
interleaved: false,
|
|
45
|
-
channels: [],
|
|
46
|
-
};
|
|
47
40
|
const totalPlanes = dims.sizeC * dims.sizeZ * dims.sizeT;
|
|
48
41
|
const numLevels = multiscales.images.length;
|
|
49
|
-
//
|
|
50
|
-
const
|
|
51
|
-
for (let ifdIdx = 0; ifdIdx < totalPlanes; ifdIdx++) {
|
|
52
|
-
// Find the (c, z, t) that maps to this IFD index
|
|
42
|
+
// Build one IFD (with SubIFDs) for a given plane index.
|
|
43
|
+
const buildPlaneIfd = async (ifdIdx) => {
|
|
53
44
|
const { c, z, t } = ifdIndexToPlane(ifdIdx, dims, dimensionOrder);
|
|
54
|
-
// Read
|
|
55
|
-
const
|
|
56
|
-
|
|
45
|
+
// Read + tile the full-resolution plane
|
|
46
|
+
const planeData = await readPlane(fullResImage, dims, c, z, t, bpe);
|
|
47
|
+
const mainTiles = slicePlane(planeData, dims.sizeX, dims.sizeY, bpe, tileSize);
|
|
57
48
|
const isFirst = ifdIdx === 0;
|
|
58
49
|
const tags = makeImageTags(dims.sizeX, dims.sizeY, tiffDtype.bitsPerSample, tiffDtype.sampleFormat, "none", // compression handled by buildTiff
|
|
59
|
-
isFirst ? omeXml : undefined, false);
|
|
50
|
+
isFirst ? omeXml : undefined, false, tileSize);
|
|
60
51
|
// Build SubIFDs for pyramid levels (if any)
|
|
61
52
|
const subIfds = [];
|
|
62
53
|
for (let level = 1; level < numLevels; level++) {
|
|
63
54
|
const subImage = multiscales.images[level];
|
|
64
55
|
const subDims = extractLevelDimensions(subImage, dims);
|
|
65
|
-
const
|
|
66
|
-
const
|
|
67
|
-
undefined, true
|
|
68
|
-
|
|
56
|
+
const subPlane = await readPlane(subImage, subDims, c, z, t, bpe);
|
|
57
|
+
const subTiles = slicePlane(subPlane, subDims.sizeX, subDims.sizeY, bpe, tileSize);
|
|
58
|
+
const subTags = makeImageTags(subDims.sizeX, subDims.sizeY, tiffDtype.bitsPerSample, tiffDtype.sampleFormat, "none", undefined, true, // isSubResolution
|
|
59
|
+
tileSize);
|
|
60
|
+
subIfds.push({ tags: subTags, tiles: subTiles });
|
|
69
61
|
}
|
|
70
|
-
|
|
62
|
+
return {
|
|
71
63
|
tags,
|
|
72
|
-
|
|
64
|
+
tiles: mainTiles,
|
|
73
65
|
subIfds: subIfds.length > 0 ? subIfds : undefined,
|
|
74
|
-
}
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
// Read planes with bounded concurrency
|
|
69
|
+
const mainIfds = new Array(totalPlanes);
|
|
70
|
+
const effectiveConcurrency = Math.max(1, Math.min(concurrency, totalPlanes));
|
|
71
|
+
for (let start = 0; start < totalPlanes; start += effectiveConcurrency) {
|
|
72
|
+
const end = Math.min(start + effectiveConcurrency, totalPlanes);
|
|
73
|
+
const batch = [];
|
|
74
|
+
for (let i = start; i < end; i++) {
|
|
75
|
+
batch.push(buildPlaneIfd(i).then((ifd) => { mainIfds[i] = ifd; }));
|
|
76
|
+
}
|
|
77
|
+
await Promise.all(batch);
|
|
75
78
|
}
|
|
76
|
-
return buildTiff(mainIfds, { compression, compressionLevel });
|
|
79
|
+
return buildTiff(mainIfds, { compression, compressionLevel, format });
|
|
77
80
|
}
|
|
78
81
|
// ── Internal helpers ────────────────────────────────────────────────
|
|
82
|
+
/**
|
|
83
|
+
* Slice a plane into tiles or return as a single strip.
|
|
84
|
+
* Decides based on whether the image is large enough to warrant tiling.
|
|
85
|
+
*/
|
|
86
|
+
function slicePlane(planeBytes, width, height, bpe, tileSize) {
|
|
87
|
+
if (tileSize > 0 && (width > tileSize || height > tileSize)) {
|
|
88
|
+
return sliceTiles(planeBytes, width, height, bpe, tileSize, tileSize);
|
|
89
|
+
}
|
|
90
|
+
// Small image: single strip
|
|
91
|
+
return [planeBytes];
|
|
92
|
+
}
|
|
79
93
|
/**
|
|
80
94
|
* Map a linear IFD index back to (c, z, t) based on DimensionOrder.
|
|
81
95
|
* This is the inverse of getIfdIndex.
|
package/dist/write.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.js","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,+BAA+B;
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fideus-labs/fiff",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Present TIFF files as a zarrita.js Zarr store following the NGFF OME-Zarr data model",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -40,7 +40,7 @@
|
|
|
40
40
|
"prepublishOnly": "bun run build"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"geotiff": "^3.0.
|
|
43
|
+
"geotiff": "^3.0.3",
|
|
44
44
|
"pako": "^2.1.0",
|
|
45
45
|
"zarrita": "^0.6.1"
|
|
46
46
|
},
|
|
@@ -54,7 +54,7 @@
|
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
56
|
"@fideus-labs/ngff-zarr": "^0.8.0",
|
|
57
|
-
"@types/bun": "^1.
|
|
57
|
+
"@types/bun": "^1.3.9",
|
|
58
58
|
"@types/pako": "^2.0.4",
|
|
59
59
|
"typescript": "^5.9.3"
|
|
60
60
|
}
|