@cmi-dair/nifti-stream - v0.1.0

nifti-stream

A streaming parser for NIFTI-1 and NIFTI-2 neuroimaging files, designed for efficient client-side processing and progressive loading in web applications.

Based on NIFTI-Reader-JS.

  • 🚰 True Streaming: Process NIFTI files as they download, no need to wait for complete file
  • 🔄 Progressive Loading: Load and display slices as they arrive
  • 📊 Flexible Dimension Handling: Stream 2D slices, 3D volumes, or 4D timeseries
  • 🗜️ Automatic Decompression: Handles gzipped NIFTI files transparently
  • 🎯 Selective Loading: Read only the header, or stop after specific slices
  • 💻 Browser-Ready: Works directly in modern browsers
  • 📦 Lightweight: ~17kB minified, no dependencies

See our live demo and check out the demo source code.

npm install @cmi-dair/nifti-stream
import { NiftiStream } from 'nifti-stream';

// Get a ReadableStream from fetch
const response = await fetch('brain.nii.gz');
const reader = new NiftiStream(response.body, {
sliceDimension: 2, // Stream 2D slices
onHeader: (header) => {
console.log('Dimensions:', header.dims);
},
onSlice: (data, indices) => {
// Process each slice as it arrives
displaySlice(data, indices);
}
});

await reader.start();
const reader = new NiftiStream(stream, {
// Choose how to slice the data
sliceDimension: 2, // 2 for XY slices, 3 for volumes, 4 for timeseries

// Get header metadata
onHeader: (header) => {
console.log(header.dims); // Image dimensions
console.log(header.pixDims); // Voxel sizes
console.log(header.datatype); // Data type
return false; // Return true to stop after header
},

// Handle extensions if present
onExtension: (extension) => {
if (extension) {
console.log(extension.ecode); // Extension code
console.log(extension.edata); // Extension data
}
},

// Process image data
onSlice: (data, indices, header) => {
// data: ArrayBuffer containing raw slice data
// indices: Position of slice in dataset
// header: Reference to NIFTI header
},

// Handle any errors
onError: (error) => {
console.error('Error:', error);
}
});

Stop streaming at any time:

await reader.stop();

Full API documentation is available at childmindresearch.github.io/nifti-stream.

Contributions are welcome! Please feel free to submit a Pull Request.

MIT