From e49dd8f45bb0b64ad6facc1f40434eb40dc2f65d Mon Sep 17 00:00:00 2001 From: Chenkai_Jin Date: Wed, 17 Jan 2024 15:58:53 +0800 Subject: [PATCH 1/5] feat: nifti-volume-loader support more datatype corresponds to typed array such as Int32 --- .../nifti-volume-loader/src/helpers/convert.ts | 15 +++++++++++++++ .../src/helpers/fetchAndAllocateNiftiVolume.ts | 14 ++++++++++++-- .../src/helpers/modalityScaleNifti.ts | 10 +++++++++- 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/packages/nifti-volume-loader/src/helpers/convert.ts b/packages/nifti-volume-loader/src/helpers/convert.ts index a42e793648..744e14b89d 100644 --- a/packages/nifti-volume-loader/src/helpers/convert.ts +++ b/packages/nifti-volume-loader/src/helpers/convert.ts @@ -18,9 +18,24 @@ const invertDataPerFrame = (dimensions, imageDataArray) => { } else if (imageDataArray instanceof Int16Array) { TypedArrayConstructor = Int16Array; bytesPerVoxel = 2; + } else if (imageDataArray instanceof Int32Array) { + TypedArrayConstructor = Int32Array; + bytesPerVoxel = 4; } else if (imageDataArray instanceof Float32Array) { TypedArrayConstructor = Float32Array; bytesPerVoxel = 4; + } else if (imageDataArray instanceof Float64Array) { + TypedArrayConstructor = Float64Array; + bytesPerVoxel = 8; + } else if (imageDataArray instanceof Int8Array) { + TypedArrayConstructor = Int8Array; + bytesPerVoxel = 1; + } else if (imageDataArray instanceof Uint16Array) { + TypedArrayConstructor = Uint16Array; + bytesPerVoxel = 2; + } else if (imageDataArray instanceof Uint32Array) { + TypedArrayConstructor = Uint32Array; + bytesPerVoxel = 4; } else { throw new Error( 'imageDataArray needs to be a Uint8Array, Int16Array or Float32Array.' diff --git a/packages/nifti-volume-loader/src/helpers/fetchAndAllocateNiftiVolume.ts b/packages/nifti-volume-loader/src/helpers/fetchAndAllocateNiftiVolume.ts index 5288c96349..05f52b96fd 100644 --- a/packages/nifti-volume-loader/src/helpers/fetchAndAllocateNiftiVolume.ts +++ b/packages/nifti-volume-loader/src/helpers/fetchAndAllocateNiftiVolume.ts @@ -71,10 +71,20 @@ export const getTypedNiftiArray = (datatypeCode, niftiImageBuffer) => { switch (datatypeCode) { case NIFTICONSTANTS.NIFTI_TYPE_UINT8: return new Uint8Array(niftiImageBuffer); - case NIFTICONSTANTS.NIFTI_TYPE_FLOAT32: - return new Float32Array(niftiImageBuffer); case NIFTICONSTANTS.NIFTI_TYPE_INT16: return new Int16Array(niftiImageBuffer); + case NIFTICONSTANTS.NIFTI_TYPE_INT32: + return new Int32Array(niftiImageBuffer); + case NIFTICONSTANTS.NIFTI_TYPE_FLOAT32: + return new Float32Array(niftiImageBuffer); + case NIFTICONSTANTS.NIFTI_TYPE_FLOAT64: + return new Float64Array(niftiImageBuffer); + case NIFTICONSTANTS.NIFTI_TYPE_INT8: + return new Int8Array(niftiImageBuffer); + case NIFTICONSTANTS.NIFTI_TYPE_UINT16: + return new Uint16Array(niftiImageBuffer); + case NIFTICONSTANTS.NIFTI_TYPE_UINT32: + return new Uint32Array(niftiImageBuffer); default: throw new Error(`datatypeCode ${datatypeCode} is not yet supported`); } diff --git a/packages/nifti-volume-loader/src/helpers/modalityScaleNifti.ts b/packages/nifti-volume-loader/src/helpers/modalityScaleNifti.ts index 46383d1b64..3581b7ea5b 100644 --- a/packages/nifti-volume-loader/src/helpers/modalityScaleNifti.ts +++ b/packages/nifti-volume-loader/src/helpers/modalityScaleNifti.ts @@ -8,7 +8,15 @@ * @returns The array being scaled */ export default function modalityScaleNifti( - array: Float32Array | Int16Array | Uint8Array, + array: + | Uint8Array + | Int16Array + | Int32Array + | Float32Array + | Float64Array + | Int8Array + | Uint16Array + | Uint32Array, niftiHeader ): void { const arrayLength = array.length; From 785759717df8421f10cc84f1083035721638e680 Mon Sep 17 00:00:00 2001 From: Chenkai_Jin Date: Mon, 22 Jan 2024 16:29:10 +0800 Subject: [PATCH 2/5] bugfix: invertDataPerFrame in nifti-volume-loader --- packages/nifti-volume-loader/src/helpers/convert.ts | 2 +- .../src/helpers/fetchAndAllocateNiftiVolume.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/nifti-volume-loader/src/helpers/convert.ts b/packages/nifti-volume-loader/src/helpers/convert.ts index 744e14b89d..5b241f79f4 100644 --- a/packages/nifti-volume-loader/src/helpers/convert.ts +++ b/packages/nifti-volume-loader/src/helpers/convert.ts @@ -44,7 +44,7 @@ const invertDataPerFrame = (dimensions, imageDataArray) => { // Make a copy of the data first using the browser native fast TypedArray.set(). const newImageDataArray = new TypedArrayConstructor( - imageDataArray.byteLength + imageDataArray.byteLength / bytesPerVoxel ); const view = new TypedArrayConstructor(imageDataArray); diff --git a/packages/nifti-volume-loader/src/helpers/fetchAndAllocateNiftiVolume.ts b/packages/nifti-volume-loader/src/helpers/fetchAndAllocateNiftiVolume.ts index 05f52b96fd..3fb756d7dc 100644 --- a/packages/nifti-volume-loader/src/helpers/fetchAndAllocateNiftiVolume.ts +++ b/packages/nifti-volume-loader/src/helpers/fetchAndAllocateNiftiVolume.ts @@ -237,8 +237,7 @@ export default async function fetchAndAllocateNiftiVolume( break; - case 16: - case 32: + default: scalarData = createFloat32SharedArray( dimensions[0] * dimensions[1] * dimensions[2] ); From 48cde3b19f0d9c8b5fe33e8fb36c06f63b872405 Mon Sep 17 00:00:00 2001 From: Chenkai_Jin Date: Tue, 23 Jan 2024 10:02:55 +0800 Subject: [PATCH 3/5] feat: nifti-volume-loader more datatype(signed int8) by float32. There is something wrong with function 'createInt16SharedArray' and 'createUint16SharedArray' because window.crossOriginIsolated is false --- .../src/helpers/fetchAndAllocateNiftiVolume.ts | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/packages/nifti-volume-loader/src/helpers/fetchAndAllocateNiftiVolume.ts b/packages/nifti-volume-loader/src/helpers/fetchAndAllocateNiftiVolume.ts index 3fb756d7dc..bd47749765 100644 --- a/packages/nifti-volume-loader/src/helpers/fetchAndAllocateNiftiVolume.ts +++ b/packages/nifti-volume-loader/src/helpers/fetchAndAllocateNiftiVolume.ts @@ -159,7 +159,6 @@ export default async function fetchAndAllocateNiftiVolume( const { BitsAllocated, - PixelRepresentation, PhotometricInterpretation, ImageOrientationPatient, Columns, @@ -194,7 +193,6 @@ export default async function fetchAndAllocateNiftiVolume( scanAxisNormal[1], scanAxisNormal[2], ]) as Types.Mat3; - const signed = PixelRepresentation === 1; // Check if it fits in the cache before we allocate data // TODO Improve this when we have support for more types @@ -223,17 +221,11 @@ export default async function fetchAndAllocateNiftiVolume( let scalarData; - switch (BitsAllocated) { - case 8: - if (signed) { - throw new Error( - '8 Bit signed images are not yet supported by this plugin.' - ); - } else { - scalarData = createUint8SharedArray( - dimensions[0] * dimensions[1] * dimensions[2] - ); - } + switch (niftiHeader.datatypeCode) { + case NIFTICONSTANTS.NIFTI_TYPE_UINT8: + scalarData = createUint8SharedArray( + dimensions[0] * dimensions[1] * dimensions[2] + ); break; From 726030ec5c1d88c631a52c422691fb66aeb8baaf Mon Sep 17 00:00:00 2001 From: Chenkai_Jin Date: Tue, 23 Jan 2024 10:32:06 +0800 Subject: [PATCH 4/5] fix: update error message --- packages/nifti-volume-loader/src/helpers/convert.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/nifti-volume-loader/src/helpers/convert.ts b/packages/nifti-volume-loader/src/helpers/convert.ts index 5b241f79f4..f18825a06b 100644 --- a/packages/nifti-volume-loader/src/helpers/convert.ts +++ b/packages/nifti-volume-loader/src/helpers/convert.ts @@ -38,7 +38,7 @@ const invertDataPerFrame = (dimensions, imageDataArray) => { bytesPerVoxel = 4; } else { throw new Error( - 'imageDataArray needs to be a Uint8Array, Int16Array or Float32Array.' + 'imageDataArray needs to be a Uint8Array, Int16Array, Int32Array, Float32Array, Float64Array, Int8Array, Uint16Array or Uint32Array.' ); } From b21aa70349b7b211c34063bc3b6ce9bdad8c9f98 Mon Sep 17 00:00:00 2001 From: Chenkai_Jin Date: Wed, 24 Jan 2024 10:40:15 +0800 Subject: [PATCH 5/5] feat: yarn build:update-api --- common/reviews/api/nifti-volume-loader.api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/reviews/api/nifti-volume-loader.api.md b/common/reviews/api/nifti-volume-loader.api.md index 1ae93c70b1..8d42efacc8 100644 --- a/common/reviews/api/nifti-volume-loader.api.md +++ b/common/reviews/api/nifti-volume-loader.api.md @@ -46,7 +46,7 @@ export { helpers } function makeVolumeMetadata(niftiHeader: any, orientation: any, scalarData: any): Types.Metadata; // @public (undocumented) -function modalityScaleNifti(array: Float32Array | Int16Array | Uint8Array, niftiHeader: any): void; +function modalityScaleNifti(array: Uint8Array | Int16Array | Int32Array | Float32Array | Float64Array | Int8Array | Uint16Array | Uint32Array, niftiHeader: any): void; // @public (undocumented) export class NiftiImageVolume extends ImageVolume {