@fideus-labs/fiff

中文文档
0.8.2发布于 2026/10/09MITTypeScriptES Module近 30 天下载 7225

使用 NGFF OME- Zarr 数据模型将 TIFF 文件作为 sarrita.js Zarr 存储

中文使用文档
文档目录24 节
  1. * 特性
  2. 阅读
  3. 写入
  4. * 安装
  5. 使用量
  6. 读取: 打开 OME- TIFF 作为 Zar 商店
  7. 读取: 从 TiffStore 装入多级
  8. 写入: 将 ngff- zarr 多级转换为 OME- TIFF
  9. 工人池:向网络工人卸载压缩
  10. 自定义平面阅读器( O) getPlane (中文(简体) )
  11. 读取 API
  12. 工厂方法
  13. 选项
  14. 公众访问器
  15. 写 API
  16. toOmeTiff(multiscales, options?)
  17. 写入选项
  18. 发展
  19. · 先决条件
  20. QQ 设置
  21. 项目结构
  22. QQ 命令
  23. 捐款
  24. 许可证

(法语)

CI npm version license

读写 OME-TIFF( 欧美论坛) 通过 a 文件 萨里塔.js 跟踪Zarr商店 OME-Zarr v0.5 (英语) 数据模型.

* 特性

阅读

  • 🚀 懒惰的 HTTP 范围请求 -- 数据按要求通过 giotiff.js (英语) readRasters(),不需要完整文件下载
  • 📐 OME-XML 支持 - 分析 OME-XML 元数据,用于维度、通道、, 物理单位和所有6个尺寸顺序
  • 🔍 金字塔检测 -- 自动发现多分辨率级别 通过子IFDs(现代),平面IFDs(遗留),或COG概览
  • 🧩 边平面零铺设 -- 边界块自动添加到 正确 Zarr 消耗的全部瓦片大小
  • 🔗 zarrita.js 兼容性 -- 执行 AsyncReadable 接口; 直接使用与 zarr.open() 从扎里塔.js
  • 📋 OME- Zarr v0.5 输出 -- 生成 Zarr v3 元数据 ome.multiscales 财务报告和审定财务报表 ome.omero 属性

写入

  • 📝 OME-TIFF 生成 -- 转换ngff- sarr Multiscales 对象为 有效的 OME- TIFF 有嵌入式 OME- XML 元数据的文件
  • 🔻 完全金字塔支持 -- 多解析级为 SubIFDs, 匹配现代 OME-TIFF 金字塔公约
  • 🗜️ 断层压缩 - Async zlib/通过土生土长 CompressionStream (非阻断) 与同步的后退
  • 🧵 工人集合支助 - 可选 @fideus-labs/worker-pool 融合 向Web Workers卸载压缩并解压,全部释放 主线程
  • 🧱 倾斜输出 -- 大图像自动写入为 256x256 块 (可配置), OME-TIFF 高效随机访问推荐格式
  • ⚡ 平行平面读取 -- 飞机用有限度的货币阅读 (可配置)用于从 aync 数据源快速写入
  • 💾 BigTIFF 支助 -- 文件超过时自动使用64位平移格式 4GB,手动覆盖通过 format 选项
  • 📐 5D支助 - 处理所有尺寸命令(XYZCT、XYZTC等)和 任意组合 T、 C、 Z、 Y、 X轴
  • 🔌 自定义平面阅读器 -- 可插件 getPlane 调用替换 内部 zarr.get(),使工人集体解压或零拷贝读取 从未压缩的 zarr 阵列中

* 安装

npm install @fideus-labs/fiff

对于写入支持, 同时安装可选的对等依赖 :

npm install @fideus-labs/ngff-zarr

工人池支持(向网络工人卸载压缩/解压):

npm install @fideus-labs/worker-pool

使用量

读取: 打开 OME- TIFF 作为 Zar 商店

从远程 URL

import { TiffStore } from "@fideus-labs/fiff";
import * as zarr from "zarrita";

const store = await TiffStore.fromUrl("https://example.com/image.ome.tif");
const group = await zarr.open(store as unknown as zarr.Readable, { kind: "group" });

// Open the full-resolution array (level 0)
const arr = await zarr.open(group.resolve("0"), { kind: "array" });
const chunk = await zarr.get(arr);

console.log(chunk.shape); // e.g. [1, 3, 1, 512, 512]
console.log(chunk.data);  // Float32Array, Uint16Array, etc.

从矩阵缓冲器

const response = await fetch("https://example.com/image.tif");
const buffer = await response.arrayBuffer();
const store = await TiffStore.fromArrayBuffer(buffer);

从文件 / Blob 中

const file = document.querySelector("input[type=file]").files[0];
const store = await TiffStore.fromBlob(file);

从现有的 GeoTIFF 实例

import { fromUrl } from "geotiff";

const tiff = await fromUrl("https://example.com/image.tif");
const store = await TiffStore.fromGeoTIFF(tiff);

访问存储元数据

const store = await TiffStore.fromUrl("https://example.com/image.ome.tif");

store.levels;         // number of resolution levels
store.dataType;       // "uint16", "float32", etc.
store.dimensionNames; // ["t", "c", "z", "y", "x"]
store.getShape(0);    // full-res shape, e.g. [1, 3, 1, 2048, 2048]
store.getShape(1);    // level 1 shape, e.g. [1, 3, 1, 1024, 1024]
store.ome;            // parsed OME-XML image metadata (if present)
store.pyramidInfo;    // pyramid structure details

读取: 从 TiffStore 装入多级

TiffStore 执行 zarrita Readable 界面,所以可以通过 直接到gff -zarr's的 fromNgffZarr 获取 Multiscales 对象 :

import { TiffStore } from "@fideus-labs/fiff";
import { fromNgffZarr } from "@fideus-labs/ngff-zarr";

const store = await TiffStore.fromUrl("https://example.com/image.ome.tif");
const multiscales = await fromNgffZarr(store, { version: "0.5" });

const image = multiscales.images[0];
console.log(image.dims);        // e.g. ["t", "c", "z", "y", "x"]
console.log(image.data.shape);  // e.g. [1, 3, 1, 512, 512]
console.log(image.data.dtype);  // e.g. "uint16"
console.log(image.scale);       // e.g. { t: 1, c: 1, z: 1, y: 0.5, x: 0.5 }

console.log(multiscales.metadata.axes);     // axis definitions
console.log(multiscales.metadata.datasets); // dataset paths and transforms

写入: 将 ngff- zarr 多级转换为 OME- TIFF

toOmeTiff() 需要一个纳克-扎尔 Multiscales 对象返回完整 作为 OME-TIFF 文件 ArrayBuffer。 。 。 .

基本写法

import { toOmeTiff } from "@fideus-labs/fiff";
import {
  createNgffImage,
  createAxis,
  createDataset,
  createMetadata,
  createMultiscales,
} from "@fideus-labs/ngff-zarr";
import * as zarr from "zarrita";

// 1. Create an ngff-zarr image
const image = await createNgffImage(
  [],              // no parent images
  [512, 512],      // shape: [y, x]
  "uint16",        // data type
  ["y", "x"],      // dimension names
  { y: 0.5, x: 0.5 },    // pixel spacing (micrometers)
  { y: 0.0, x: 0.0 },    // origin offsets
  "my-image",
);

// 2. Populate pixel data
const data = new Uint16Array(512 * 512);
for (let i = 0; i < data.length; i++) data[i] = i % 65536;
await zarr.set(image.data, null, {
  data,
  shape: [512, 512],
  stride: [512, 1],
});

// 3. Build the Multiscales object
const axes = [
  createAxis("y", "space", "micrometer"),
  createAxis("x", "space", "micrometer"),
];
const datasets = [createDataset("0", [0.5, 0.5], [0.0, 0.0])];
const metadata = createMetadata(axes, datasets, "my-image");
const multiscales = createMultiscales([image], metadata);

// 4. Write to OME-TIFF
const buffer = await toOmeTiff(multiscales);

// Save to disk (Node.js / Bun)
await Bun.write("output.ome.tif", buffer);

写入选项

const buffer = await toOmeTiff(multiscales, {
  compression: "deflate",  // "deflate" (default) or "none"
  compressionLevel: 6,     // 1-9, default 6 (only for deflate)
  dimensionOrder: "XYZCT", // IFD layout order, default "XYZCT"
  imageName: "my-image",   // name in OME-XML metadata
  creator: "my-app",       // creator string in OME-XML
  tileSize: 256,           // tile size in px (0 = strip-based), default 256
  concurrency: 4,          // parallel plane reads, default 4
  format: "auto",          // "auto" | "classic" | "bigtiff", default "auto"
  getPlane: zarrGet,       // custom plane reader (e.g. ngff-zarr's zarrGet)
});

工人池:向网络工人卸载压缩

通过一个 @fideus-labs/worker-pool 例如,降压压缩(写作) 并使用该标准在网络工人上运行解压(读取) CompressionStream 编号 : DecompressionStream APIs — 完全释放主 线程.

用工人池写作

import { toOmeTiff } from "@fideus-labs/fiff";
import WorkerPool from "@fideus-labs/worker-pool";

const pool = new WorkerPool(navigator.hardwareConcurrency ?? 4);

const buffer = await toOmeTiff(multiscales, {
  pool,              // tiles are compressed on workers
  compression: "deflate",
});

pool.terminateWorkers();

用工人游泳池阅读

import { TiffStore } from "@fideus-labs/fiff";
import WorkerPool from "@fideus-labs/worker-pool";

const pool = new WorkerPool(4);

// Registers a worker-backed deflate decoder with geotiff.js.
// This is a global registration — it affects all geotiff instances.
const store = await TiffStore.fromUrl(
  "https://example.com/image.ome.tif",
  { pool },
);

// All subsequent chunk reads decompress on workers
const group = await zarr.open(store as unknown as zarr.Readable, { kind: "group" });
const arr = await zarr.open(group.resolve("0"), { kind: "array" });
const chunk = await zarr.get(arr);

pool.terminateWorkers();

低级别: 带游泳池的构建Tiff

import { buildTiff, type WritableIfd } from "@fideus-labs/fiff";
import WorkerPool from "@fideus-labs/worker-pool";

const pool = new WorkerPool(4);
const ifds: WritableIfd[] = [/* ... */];

const buffer = await buildTiff(ifds, {
  compression: "deflate",
  pool,
});

pool.terminateWorkers();

自定义平面阅读器( O)getPlane(中文(简体) )

默认 toOmeTiff() 读取每个带有内置的平面( C, Z, T) zarr.get()。您可以通过 getPlane 选项。 这对于:

  • 卸载去压 - 纳克扎尔的 zarrGet 运行 blosc 解压在工人池取而代之的是主线.
  • 完全跳过解压 - 当记忆中的撒勒阵列是 创建于 bytesOnlyCodecs() (没有压缩),读作是微不足道的 零起落点.
import { toOmeTiff } from "@fideus-labs/fiff"
import { bytesOnlyCodecs, toMultiscales, zarrGet } from "@fideus-labs/ngff-zarr"

// Create multiscales with no compression (OME-TIFF will re-compress with deflate)
const multiscales = await toMultiscales(ngffImage, {
  method: Methods.ITKWASM_GAUSSIAN,
  codecs: bytesOnlyCodecs(),
})

// Write OME-TIFF using zarrGet to read planes (worker-pool-aware)
const buffer = await toOmeTiff(multiscales, {
  compression: "deflate",
  getPlane: zarrGet,
})

这个 GetPlane 回调类型镜像 zarr.get()数字 :

type GetPlane = (
  data: zarr.Array<zarr.DataType, zarr.Readable>,
  selection: (number | null)[],
) => Promise<{ data: unknown }>

如何运作

  • 工人使用情况 CompressionStream("deflate") 编号 : DecompressionStream("deflate") - 工人内部没有附属物或其他附属物
  • 工人脚本在运行时作为 blob URL 内置( 没有单独的文件服务)
  • 主线和工人之间转移( 零拷贝) 串联
  • 当压缩级别不是默认的 (6),或者没有提供池, fiff倒回已存在的主行路径( CompressStream - > fflate)
  • 游泳池的有界货币 代替无界货币 Promise.all 超过平板

多分辨率金字塔

当 Multiscales 对象包含多个图像(分辨率水平), 所有子分辨率级别都写为 SubIFD:

const fullRes = await createNgffImage([], [1024, 1024], "uint16", ["y", "x"], ...);
const halfRes = await createNgffImage([], [512, 512], "uint16", ["y", "x"], ...);
// ... populate both images with zarr.set() ...

const datasets = [
  createDataset("0", [0.5, 0.5], [0.0, 0.0]),
  createDataset("1", [1.0, 1.0], [0.0, 0.0]),
];
const metadata = createMetadata(axes, datasets, "pyramid");
const multiscales = createMultiscales([fullRes, halfRes], metadata);

const buffer = await toOmeTiff(multiscales);
// Result: OME-TIFF with full-res IFDs + half-res SubIFDs

圆行: 写回读

import { toOmeTiff, TiffStore } from "@fideus-labs/fiff";
import * as zarr from "zarrita";

const buffer = await toOmeTiff(multiscales);
const store = await TiffStore.fromArrayBuffer(buffer);
const group = await zarr.open(store as unknown as zarr.Readable, { kind: "group" });
const arr = await zarr.open(group.resolve("0"), { kind: "array" });
const result = await zarr.get(arr);
// result.data contains the original pixel values

读取 API

工厂方法

方法说明
TiffStore.fromUrl(url, opts?)从远程 URL( HTTP 范围请求) 打开
TiffStore.fromArrayBuffer(buf)从内嵌式阵列打开
TiffStore.fromBlob(blob)从 Blob 或文件打开
TiffStore.fromGeoTIFF(tiff)从已打开的 GeoTIFF 实例打开

选项

所有工厂的方法都接受选择 TiffStoreOptions 对象 :

选项类型默认说明
offsetsnumber[]undefined预算的IFD字节抵销O(1)访问
headersRecord<string, string>undefined远程 TIFF 请求的额外 HTTP 头
poolDeflatePoolundefined卸载解压缩的工人池(全球地理平面解码器覆盖)
workerUrlstringundefined自定义工人脚本 URL( 仅当 pool (已提供)

公众访问器

访问器类型说明
store.levelsnumber决议数量
store.dataTypeZarrDataTypeZarr 数据类型字符串
store.omeOmeImage[]已解析的 OME- XML 图像( 如果存在)
store.pyramidInfoPyramidInfo金字塔结构细节
store.dimensionNamesstring[]尺寸名称( 例如 ). ["t", "c", "z", "y", "x"](中文(简体) )
store.getShape(l)number[]分辨率形状 l
store.getChunkShape(l)number[]解析级的块形状 l

写 API

toOmeTiff(multiscales, options?)

参数类型说明
multiscalesMultiscalesngff- sarr 带有有像素数据的多比例对象
optionsWriteOptions可选作者配置

回返情况: Promise<ArrayBuffer> - 一个完整的 OME-TIFF 文件.

写入选项

选项类型默认说明
compression"none" | "deflate""deflate"像素数据压缩
compressionLevelnumber6一级至九级(较高=较小)
dimensionOrderstring"XYZCT"IFD 平面布局顺序
imageNamestring"image"在 OME- XML 中的图像名称
creatorstring"fiff"OME- XML 创建字符串
tileSizenumber256平板大小(0 = 有条形,必须是 x16)
concurrencynumber4最大平行平面读取
format"auto" | "classic" | "bigtiff""auto"TIFF格式(自动检测 BigTIFF > 4 GB)
poolDeflatePoolundefined卸载给 Web 工人压缩的工人池
workerUrlstringundefined自定义工人脚本 URL( 仅当 pool (已提供)
getPlaneGetPlaneundefined自定义平面阅读器替换内部 zarr.get() 呼叫(见下文)

发展

· 先决条件

QQ 设置

git clone https://github.com/fideus-labs/fiff.git
cd fiff
bun install

项目结构

src/
  index.ts           # Public API exports
  tiff-store.ts      # TiffStore class (AsyncReadable implementation)
  metadata.ts        # Zarr v3 / OME-Zarr 0.5 metadata synthesis
  ome-xml.ts         # OME-XML parser (dimensions, channels, DimensionOrder)
  ifd-indexer.ts     # IFD-to-pyramid-level mapping (SubIFD/legacy/COG)
  chunk-reader.ts    # Pixel data reading via geotiff.js readRasters
  dtypes.ts          # TIFF ↔ Zarr data_type mapping
  utils.ts           # Key parsing, pixel window computation, encoding
  write.ts           # High-level toOmeTiff() writer
  tiff-writer.ts     # Low-level TIFF binary builder (IFDs, SubIFDs, deflate)
  ome-xml-writer.ts  # OME-XML generation from Multiscales metadata
  deflate-worker.ts  # Inline Web Worker source for compress/decompress
  worker-utils.ts    # Worker pool task factories and blob URL helper
  worker-decoder.ts  # Worker-backed geotiff deflate decoder
test/
  fixtures.ts        # Test TIFF generation helpers
  *.test.ts          # 201 tests across 11 files

QQ 命令

命令说明
bun run build构建到 dist/ (ESM+声明)
bun test运行所有测试
bun run typecheck类型检查完整工程

捐款

欢迎捐款! 请看 捐款额 页:1 设置指令,代码样式指南,以及拉动请求工作流程.

许可证

麻省理工学院 - 版权(c) Fideus Labs有限责任公司

版本与发布记录

@fideus-labs/fiff 共发布 16 个版本,首次发布于 2026/02/15;过去 12 个月发布了 16 个版本。

版本发布日期距今
0.8.2latest2026/10/091 个月前
0.8.12026/10/081 个月前
0.8.02026/09/301 个月前
0.7.02026/02/218 个月前
0.6.02026/02/208 个月前
0.5.22026/02/188 个月前

关于 @fideus-labs/fiff 的常见问题

@fideus-labs/fiff 是什么?

使用 NGFF OME- Zarr 数据模型将 TIFF 文件作为 sarrita.js Zarr 存储

如何安装 @fideus-labs/fiff?

在项目目录运行 npm install @fideus-labs/fiff,或使用 pnpm add / yarn add / bun add。

@fideus-labs/fiff 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@fideus-labs/fiff 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@fideus-labs/fiff 可以商用吗?

@fideus-labs/fiff 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@fideus-labs/fiff 的下载量有多少?

根据 npm 官方下载统计,@fideus-labs/fiff 在 2026/10/15 – 2026/11/13 这 30 天内被下载 7,225 次,日均约 241 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@fideus-labs/fiff 还在维护吗?

最新版本 0.8.2 发布于 2026/10/09(1 个月前);至今共发布 16 个版本,其中过去 12 个月发布了 16 个;首次发布于 2026/02/15。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。