drtis-dicom-image-loader 2.19.7
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/LICENSE +21 -0
- package/README.md +173 -0
- package/dist/esm/codecs/jpeg.d.ts +29 -0
- package/dist/esm/codecs/jpeg.js +884 -0
- package/dist/esm/codecs/jpegLossless.d.ts +157 -0
- package/dist/esm/codecs/jpegLossless.js +808 -0
- package/dist/esm/constants/index.d.ts +2 -0
- package/dist/esm/constants/index.js +2 -0
- package/dist/esm/constants/transferSyntaxes.d.ts +46 -0
- package/dist/esm/constants/transferSyntaxes.js +46 -0
- package/dist/esm/decodeImageFrameWorker.d.ts +1 -0
- package/dist/esm/decodeImageFrameWorker.js +269 -0
- package/dist/esm/imageLoader/colorSpaceConverters/convertPALETTECOLOR.d.ts +3 -0
- package/dist/esm/imageLoader/colorSpaceConverters/convertPALETTECOLOR.js +77 -0
- package/dist/esm/imageLoader/colorSpaceConverters/convertRGBColorByPixel.d.ts +2 -0
- package/dist/esm/imageLoader/colorSpaceConverters/convertRGBColorByPixel.js +21 -0
- package/dist/esm/imageLoader/colorSpaceConverters/convertRGBColorByPlane.d.ts +2 -0
- package/dist/esm/imageLoader/colorSpaceConverters/convertRGBColorByPlane.js +28 -0
- package/dist/esm/imageLoader/colorSpaceConverters/convertYBRFull422ByPixel.d.ts +2 -0
- package/dist/esm/imageLoader/colorSpaceConverters/convertYBRFull422ByPixel.js +44 -0
- package/dist/esm/imageLoader/colorSpaceConverters/convertYBRFullByPixel.d.ts +2 -0
- package/dist/esm/imageLoader/colorSpaceConverters/convertYBRFullByPixel.js +33 -0
- package/dist/esm/imageLoader/colorSpaceConverters/convertYBRFullByPlane.d.ts +2 -0
- package/dist/esm/imageLoader/colorSpaceConverters/convertYBRFullByPlane.js +35 -0
- package/dist/esm/imageLoader/colorSpaceConverters/index.d.ts +7 -0
- package/dist/esm/imageLoader/colorSpaceConverters/index.js +7 -0
- package/dist/esm/imageLoader/convertColorSpace.d.ts +1 -0
- package/dist/esm/imageLoader/convertColorSpace.js +40 -0
- package/dist/esm/imageLoader/createImage.d.ts +5 -0
- package/dist/esm/imageLoader/createImage.js +245 -0
- package/dist/esm/imageLoader/decodeImageFrame.d.ts +3 -0
- package/dist/esm/imageLoader/decodeImageFrame.js +63 -0
- package/dist/esm/imageLoader/decodeJPEGBaseline8BitColor.d.ts +4 -0
- package/dist/esm/imageLoader/decodeJPEGBaseline8BitColor.js +64 -0
- package/dist/esm/imageLoader/getImageFrame.d.ts +3 -0
- package/dist/esm/imageLoader/getImageFrame.js +25 -0
- package/dist/esm/imageLoader/getInstanceModule.d.ts +3 -0
- package/dist/esm/imageLoader/getInstanceModule.js +40 -0
- package/dist/esm/imageLoader/getMinMax.d.ts +4 -0
- package/dist/esm/imageLoader/getMinMax.js +15 -0
- package/dist/esm/imageLoader/getScalingParameters.d.ts +6 -0
- package/dist/esm/imageLoader/getScalingParameters.js +16 -0
- package/dist/esm/imageLoader/imageIdToURI.d.ts +1 -0
- package/dist/esm/imageLoader/imageIdToURI.js +4 -0
- package/dist/esm/imageLoader/index.d.ts +91 -0
- package/dist/esm/imageLoader/index.js +34 -0
- package/dist/esm/imageLoader/internal/index.d.ts +10 -0
- package/dist/esm/imageLoader/internal/index.js +10 -0
- package/dist/esm/imageLoader/internal/options.d.ts +3 -0
- package/dist/esm/imageLoader/internal/options.js +19 -0
- package/dist/esm/imageLoader/internal/rangeRequest.d.ts +9 -0
- package/dist/esm/imageLoader/internal/rangeRequest.js +121 -0
- package/dist/esm/imageLoader/internal/streamRequest.d.ts +2 -0
- package/dist/esm/imageLoader/internal/streamRequest.js +93 -0
- package/dist/esm/imageLoader/internal/xhrRequest.d.ts +3 -0
- package/dist/esm/imageLoader/internal/xhrRequest.js +108 -0
- package/dist/esm/imageLoader/isColorConversionRequired.d.ts +1 -0
- package/dist/esm/imageLoader/isColorConversionRequired.js +25 -0
- package/dist/esm/imageLoader/isJPEGBaseline8BitColor.d.ts +3 -0
- package/dist/esm/imageLoader/isJPEGBaseline8BitColor.js +9 -0
- package/dist/esm/imageLoader/isNMReconstructable.d.ts +1 -0
- package/dist/esm/imageLoader/isNMReconstructable.js +3 -0
- package/dist/esm/imageLoader/registerLoaders.d.ts +2 -0
- package/dist/esm/imageLoader/registerLoaders.js +7 -0
- package/dist/esm/imageLoader/wadors/combineFrameInstance.d.ts +12 -0
- package/dist/esm/imageLoader/wadors/combineFrameInstance.js +44 -0
- package/dist/esm/imageLoader/wadors/extractMultipart.d.ts +23 -0
- package/dist/esm/imageLoader/wadors/extractMultipart.js +73 -0
- package/dist/esm/imageLoader/wadors/findIndexOfString.d.ts +2 -0
- package/dist/esm/imageLoader/wadors/findIndexOfString.js +32 -0
- package/dist/esm/imageLoader/wadors/getImageQualityStatus.d.ts +3 -0
- package/dist/esm/imageLoader/wadors/getImageQualityStatus.js +8 -0
- package/dist/esm/imageLoader/wadors/getPixelData.d.ts +26 -0
- package/dist/esm/imageLoader/wadors/getPixelData.js +35 -0
- package/dist/esm/imageLoader/wadors/getTagValue.d.ts +1 -0
- package/dist/esm/imageLoader/wadors/getTagValue.js +9 -0
- package/dist/esm/imageLoader/wadors/index.d.ts +38 -0
- package/dist/esm/imageLoader/wadors/index.js +26 -0
- package/dist/esm/imageLoader/wadors/loadImage.d.ts +25 -0
- package/dist/esm/imageLoader/wadors/loadImage.js +124 -0
- package/dist/esm/imageLoader/wadors/loadImage_test.d.ts +1 -0
- package/dist/esm/imageLoader/wadors/loadImage_test.js +41 -0
- package/dist/esm/imageLoader/wadors/metaData/NMHelpers.d.ts +5 -0
- package/dist/esm/imageLoader/wadors/metaData/NMHelpers.js +38 -0
- package/dist/esm/imageLoader/wadors/metaData/USHelpers.d.ts +19 -0
- package/dist/esm/imageLoader/wadors/metaData/USHelpers.js +46 -0
- package/dist/esm/imageLoader/wadors/metaData/extractPositioningFromMetadata.d.ts +3 -0
- package/dist/esm/imageLoader/wadors/metaData/extractPositioningFromMetadata.js +18 -0
- package/dist/esm/imageLoader/wadors/metaData/getFirstNumberValue.d.ts +2 -0
- package/dist/esm/imageLoader/wadors/metaData/getFirstNumberValue.js +6 -0
- package/dist/esm/imageLoader/wadors/metaData/getNumberString.d.ts +3 -0
- package/dist/esm/imageLoader/wadors/metaData/getNumberString.js +9 -0
- package/dist/esm/imageLoader/wadors/metaData/getNumberValue.d.ts +3 -0
- package/dist/esm/imageLoader/wadors/metaData/getNumberValue.js +9 -0
- package/dist/esm/imageLoader/wadors/metaData/getNumberValues.d.ts +3 -0
- package/dist/esm/imageLoader/wadors/metaData/getNumberValues.js +20 -0
- package/dist/esm/imageLoader/wadors/metaData/getOverlayPlaneModule.d.ts +4 -0
- package/dist/esm/imageLoader/wadors/metaData/getOverlayPlaneModule.js +38 -0
- package/dist/esm/imageLoader/wadors/metaData/getSequenceItems.d.ts +3 -0
- package/dist/esm/imageLoader/wadors/metaData/getSequenceItems.js +14 -0
- package/dist/esm/imageLoader/wadors/metaData/getValue.d.ts +3 -0
- package/dist/esm/imageLoader/wadors/metaData/getValue.js +14 -0
- package/dist/esm/imageLoader/wadors/metaData/index.d.ts +7 -0
- package/dist/esm/imageLoader/wadors/metaData/index.js +7 -0
- package/dist/esm/imageLoader/wadors/metaData/metaDataProvider.d.ts +14 -0
- package/dist/esm/imageLoader/wadors/metaData/metaDataProvider.js +278 -0
- package/dist/esm/imageLoader/wadors/metaDataManager.d.ts +19 -0
- package/dist/esm/imageLoader/wadors/metaDataManager.js +68 -0
- package/dist/esm/imageLoader/wadors/register.d.ts +1 -0
- package/dist/esm/imageLoader/wadors/register.js +7 -0
- package/dist/esm/imageLoader/wadouri/combineFrameInstanceDataset.d.ts +22 -0
- package/dist/esm/imageLoader/wadouri/combineFrameInstanceDataset.js +69 -0
- package/dist/esm/imageLoader/wadouri/dataSetCacheManager.d.ts +28 -0
- package/dist/esm/imageLoader/wadouri/dataSetCacheManager.js +141 -0
- package/dist/esm/imageLoader/wadouri/dataSetCacheManager_test.d.ts +1 -0
- package/dist/esm/imageLoader/wadouri/dataSetCacheManager_test.js +10 -0
- package/dist/esm/imageLoader/wadouri/dataset-from-partial-content.d.ts +6 -0
- package/dist/esm/imageLoader/wadouri/dataset-from-partial-content.js +55 -0
- package/dist/esm/imageLoader/wadouri/fileManager.d.ts +11 -0
- package/dist/esm/imageLoader/wadouri/fileManager.js +20 -0
- package/dist/esm/imageLoader/wadouri/getEncapsulatedImageFrame.d.ts +2 -0
- package/dist/esm/imageLoader/wadouri/getEncapsulatedImageFrame.js +31 -0
- package/dist/esm/imageLoader/wadouri/getPixelData.d.ts +3 -0
- package/dist/esm/imageLoader/wadouri/getPixelData.js +13 -0
- package/dist/esm/imageLoader/wadouri/getUncompressedImageFrame.d.ts +3 -0
- package/dist/esm/imageLoader/wadouri/getUncompressedImageFrame.js +47 -0
- package/dist/esm/imageLoader/wadouri/index.d.ts +56 -0
- package/dist/esm/imageLoader/wadouri/index.js +35 -0
- package/dist/esm/imageLoader/wadouri/loadFileRequest.d.ts +2 -0
- package/dist/esm/imageLoader/wadouri/loadFileRequest.js +17 -0
- package/dist/esm/imageLoader/wadouri/loadImage.d.ts +9 -0
- package/dist/esm/imageLoader/wadouri/loadImage.js +108 -0
- package/dist/esm/imageLoader/wadouri/loadedDataSets.d.ts +7 -0
- package/dist/esm/imageLoader/wadouri/loadedDataSets.js +5 -0
- package/dist/esm/imageLoader/wadouri/metaData/USHelpers.d.ts +2 -0
- package/dist/esm/imageLoader/wadouri/metaData/USHelpers.js +44 -0
- package/dist/esm/imageLoader/wadouri/metaData/extractPositioningFromDataset.d.ts +6 -0
- package/dist/esm/imageLoader/wadouri/metaData/extractPositioningFromDataset.js +80 -0
- package/dist/esm/imageLoader/wadouri/metaData/getImagePixelModule.d.ts +4 -0
- package/dist/esm/imageLoader/wadouri/metaData/getImagePixelModule.js +79 -0
- package/dist/esm/imageLoader/wadouri/metaData/getLUTs.d.ts +4 -0
- package/dist/esm/imageLoader/wadouri/metaData/getLUTs.js +44 -0
- package/dist/esm/imageLoader/wadouri/metaData/getModalityLUTOutputPixelRepresentation.d.ts +3 -0
- package/dist/esm/imageLoader/wadouri/metaData/getModalityLUTOutputPixelRepresentation.js +30 -0
- package/dist/esm/imageLoader/wadouri/metaData/getNumberValues.d.ts +3 -0
- package/dist/esm/imageLoader/wadouri/metaData/getNumberValues.js +16 -0
- package/dist/esm/imageLoader/wadouri/metaData/getOverlayPlaneModule.d.ts +4 -0
- package/dist/esm/imageLoader/wadouri/metaData/getOverlayPlaneModule.js +36 -0
- package/dist/esm/imageLoader/wadouri/metaData/index.d.ts +5 -0
- package/dist/esm/imageLoader/wadouri/metaData/index.js +5 -0
- package/dist/esm/imageLoader/wadouri/metaData/metaDataProvider.d.ts +4 -0
- package/dist/esm/imageLoader/wadouri/metaData/metaDataProvider.js +228 -0
- package/dist/esm/imageLoader/wadouri/parseImageId.d.ts +8 -0
- package/dist/esm/imageLoader/wadouri/parseImageId.js +20 -0
- package/dist/esm/imageLoader/wadouri/register.d.ts +1 -0
- package/dist/esm/imageLoader/wadouri/register.js +9 -0
- package/dist/esm/imageLoader/wadouri/retrieveMultiframeDataset.d.ts +17 -0
- package/dist/esm/imageLoader/wadouri/retrieveMultiframeDataset.js +57 -0
- package/dist/esm/imageLoader/wadouri/unpackBinaryFrame.d.ts +3 -0
- package/dist/esm/imageLoader/wadouri/unpackBinaryFrame.js +14 -0
- package/dist/esm/index.d.ts +97 -0
- package/dist/esm/index.js +38 -0
- package/dist/esm/init.d.ts +3 -0
- package/dist/esm/init.js +23 -0
- package/dist/esm/shared/decoders/decodeBigEndian.d.ts +4 -0
- package/dist/esm/shared/decoders/decodeBigEndian.js +28 -0
- package/dist/esm/shared/decoders/decodeHTJ2K.d.ts +5 -0
- package/dist/esm/shared/decoders/decodeHTJ2K.js +109 -0
- package/dist/esm/shared/decoders/decodeJPEG2000.d.ts +5 -0
- package/dist/esm/shared/decoders/decodeJPEG2000.js +93 -0
- package/dist/esm/shared/decoders/decodeJPEGBaseline12Bit-js.d.ts +6 -0
- package/dist/esm/shared/decoders/decodeJPEGBaseline12Bit-js.js +36 -0
- package/dist/esm/shared/decoders/decodeJPEGBaseline12Bit-wasm-not-yet-working.d.ts +1 -0
- package/dist/esm/shared/decoders/decodeJPEGBaseline12Bit-wasm-not-yet-working.js +0 -0
- package/dist/esm/shared/decoders/decodeJPEGBaseline8Bit.d.ts +3 -0
- package/dist/esm/shared/decoders/decodeJPEGBaseline8Bit.js +62 -0
- package/dist/esm/shared/decoders/decodeJPEGLS.d.ts +5 -0
- package/dist/esm/shared/decoders/decodeJPEGLS.js +84 -0
- package/dist/esm/shared/decoders/decodeJPEGLossless copy.d.ts +6 -0
- package/dist/esm/shared/decoders/decodeJPEGLossless copy.js +39 -0
- package/dist/esm/shared/decoders/decodeJPEGLossless.d.ts +6 -0
- package/dist/esm/shared/decoders/decodeJPEGLossless.js +39 -0
- package/dist/esm/shared/decoders/decodeLittleEndian.d.ts +4 -0
- package/dist/esm/shared/decoders/decodeLittleEndian.js +29 -0
- package/dist/esm/shared/decoders/decodeRLE.d.ts +4 -0
- package/dist/esm/shared/decoders/decodeRLE.js +128 -0
- package/dist/esm/shared/getMinMax.d.ts +6 -0
- package/dist/esm/shared/getMinMax.js +16 -0
- package/dist/esm/shared/getMinMax_test.d.ts +1 -0
- package/dist/esm/shared/getMinMax_test.js +9 -0
- package/dist/esm/shared/getPixelDataTypeFromMinMax.d.ts +3 -0
- package/dist/esm/shared/getPixelDataTypeFromMinMax.js +26 -0
- package/dist/esm/shared/isColorImage.d.ts +1 -0
- package/dist/esm/shared/isColorImage.js +10 -0
- package/dist/esm/shared/scaling/bilinear.d.ts +1 -0
- package/dist/esm/shared/scaling/bilinear.js +32 -0
- package/dist/esm/shared/scaling/replicate.d.ts +1 -0
- package/dist/esm/shared/scaling/replicate.js +20 -0
- package/dist/esm/shared/scaling/scaleArray.d.ts +2 -0
- package/dist/esm/shared/scaling/scaleArray.js +17 -0
- package/dist/esm/types/DICOMLoaderDataSetWithFetchMore.d.ts +9 -0
- package/dist/esm/types/DICOMLoaderDataSetWithFetchMore.js +0 -0
- package/dist/esm/types/DICOMLoaderIImage.d.ts +11 -0
- package/dist/esm/types/DICOMLoaderIImage.js +0 -0
- package/dist/esm/types/DICOMLoaderImageOptions.d.ts +23 -0
- package/dist/esm/types/DICOMLoaderImageOptions.js +0 -0
- package/dist/esm/types/LoadRequestFunction.d.ts +1 -0
- package/dist/esm/types/LoadRequestFunction.js +0 -0
- package/dist/esm/types/LoaderDecodeOptions.d.ts +2 -0
- package/dist/esm/types/LoaderDecodeOptions.js +0 -0
- package/dist/esm/types/LoaderOptions.d.ts +16 -0
- package/dist/esm/types/LoaderOptions.js +0 -0
- package/dist/esm/types/LutType.d.ts +6 -0
- package/dist/esm/types/LutType.js +0 -0
- package/dist/esm/types/WADORSMetaData.d.ts +4 -0
- package/dist/esm/types/WADORSMetaData.js +0 -0
- package/dist/esm/types/WebWorkerTypes.d.ts +64 -0
- package/dist/esm/types/WebWorkerTypes.js +0 -0
- package/dist/esm/types/XHRRequest.d.ts +16 -0
- package/dist/esm/types/XHRRequest.js +0 -0
- package/dist/esm/types/index.d.ts +11 -0
- package/dist/esm/types/index.js +0 -0
- package/dist/esm/version.d.ts +2 -0
- package/dist/esm/version.js +1 -0
- package/package.json +134 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
declare function getImageTypeSubItemFromDataset(dataSet: any, index: any): any;
|
|
2
|
+
declare function extractOrientationFromDataset(dataSet: any): number[];
|
|
3
|
+
declare function extractPositionFromDataset(dataSet: any): number[];
|
|
4
|
+
declare function extractSpacingFromDataset(dataSet: any): number[];
|
|
5
|
+
declare function extractSliceThicknessFromDataset(dataSet: any): any;
|
|
6
|
+
export { getImageTypeSubItemFromDataset, extractOrientationFromDataset, extractPositionFromDataset, extractSpacingFromDataset, extractSliceThicknessFromDataset, };
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import getNumberValues from './getNumberValues';
|
|
2
|
+
import isNMReconstructable from '../../isNMReconstructable';
|
|
3
|
+
function getImageTypeSubItemFromDataset(dataSet, index) {
|
|
4
|
+
const imageType = dataSet.string('x00080008');
|
|
5
|
+
if (imageType) {
|
|
6
|
+
const subTypes = imageType.split('\\');
|
|
7
|
+
if (subTypes.length > index) {
|
|
8
|
+
return subTypes[index];
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return undefined;
|
|
12
|
+
}
|
|
13
|
+
function extractOrientationFromNMMultiframeDataset(dataSet) {
|
|
14
|
+
let imageOrientationPatient;
|
|
15
|
+
const modality = dataSet.string('x00080060');
|
|
16
|
+
if (modality?.includes('NM')) {
|
|
17
|
+
const imageSubType = getImageTypeSubItemFromDataset(dataSet, 2);
|
|
18
|
+
if (imageSubType && isNMReconstructable(imageSubType)) {
|
|
19
|
+
if (dataSet.elements.x00540022) {
|
|
20
|
+
imageOrientationPatient = getNumberValues(dataSet.elements.x00540022.items[0].dataSet, 'x00200037', 6);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return imageOrientationPatient;
|
|
25
|
+
}
|
|
26
|
+
function extractPositionFromNMMultiframeDataset(dataSet) {
|
|
27
|
+
let imagePositionPatient;
|
|
28
|
+
const modality = dataSet.string('x00080060');
|
|
29
|
+
if (modality?.includes('NM')) {
|
|
30
|
+
const imageSubType = getImageTypeSubItemFromDataset(dataSet, 2);
|
|
31
|
+
if (imageSubType && isNMReconstructable(imageSubType)) {
|
|
32
|
+
if (dataSet.elements.x00540022) {
|
|
33
|
+
imagePositionPatient = getNumberValues(dataSet.elements.x00540022.items[0].dataSet, 'x00200032', 3);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return imagePositionPatient;
|
|
38
|
+
}
|
|
39
|
+
function extractOrientationFromDataset(dataSet) {
|
|
40
|
+
let imageOrientationPatient = getNumberValues(dataSet, 'x00200037', 6);
|
|
41
|
+
if (!imageOrientationPatient && dataSet.elements.x00209116) {
|
|
42
|
+
imageOrientationPatient = getNumberValues(dataSet.elements.x00209116.items[0].dataSet, 'x00200037', 6);
|
|
43
|
+
}
|
|
44
|
+
if (!imageOrientationPatient) {
|
|
45
|
+
imageOrientationPatient =
|
|
46
|
+
extractOrientationFromNMMultiframeDataset(dataSet);
|
|
47
|
+
}
|
|
48
|
+
return imageOrientationPatient;
|
|
49
|
+
}
|
|
50
|
+
function extractPositionFromDataset(dataSet) {
|
|
51
|
+
let imagePositionPatient = getNumberValues(dataSet, 'x00200032', 3);
|
|
52
|
+
if (!imagePositionPatient && dataSet.elements.x00209113) {
|
|
53
|
+
imagePositionPatient = getNumberValues(dataSet.elements.x00209113.items[0].dataSet, 'x00200032', 3);
|
|
54
|
+
}
|
|
55
|
+
if (!imagePositionPatient) {
|
|
56
|
+
imagePositionPatient = extractPositionFromNMMultiframeDataset(dataSet);
|
|
57
|
+
}
|
|
58
|
+
return imagePositionPatient;
|
|
59
|
+
}
|
|
60
|
+
function extractSpacingFromDataset(dataSet) {
|
|
61
|
+
let pixelSpacing = getNumberValues(dataSet, 'x00280030', 2);
|
|
62
|
+
if (!pixelSpacing && dataSet.elements.x00289110) {
|
|
63
|
+
pixelSpacing = getNumberValues(dataSet.elements.x00289110.items[0].dataSet, 'x00280030', 2);
|
|
64
|
+
}
|
|
65
|
+
return pixelSpacing;
|
|
66
|
+
}
|
|
67
|
+
function extractSliceThicknessFromDataset(dataSet) {
|
|
68
|
+
let sliceThickness;
|
|
69
|
+
if (dataSet.elements.x00180050) {
|
|
70
|
+
sliceThickness = dataSet.floatString('x00180050');
|
|
71
|
+
}
|
|
72
|
+
else if (dataSet.elements.x00289110 &&
|
|
73
|
+
dataSet.elements.x00289110.items.length &&
|
|
74
|
+
dataSet.elements.x00289110.items[0].dataSet.elements.x00180050) {
|
|
75
|
+
sliceThickness =
|
|
76
|
+
dataSet.elements.x00289110.items[0].dataSet.floatString('x00180050');
|
|
77
|
+
}
|
|
78
|
+
return sliceThickness;
|
|
79
|
+
}
|
|
80
|
+
export { getImageTypeSubItemFromDataset, extractOrientationFromDataset, extractPositionFromDataset, extractSpacingFromDataset, extractSliceThicknessFromDataset, };
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
function getLutDescriptor(dataSet, tag) {
|
|
2
|
+
if (!dataSet.elements[tag] || dataSet.elements[tag].length !== 6) {
|
|
3
|
+
return;
|
|
4
|
+
}
|
|
5
|
+
return [
|
|
6
|
+
dataSet.uint16(tag, 0),
|
|
7
|
+
dataSet.uint16(tag, 1),
|
|
8
|
+
dataSet.uint16(tag, 2),
|
|
9
|
+
];
|
|
10
|
+
}
|
|
11
|
+
function getLutData(lutDataSet, tag, lutDescriptor) {
|
|
12
|
+
const lut = [];
|
|
13
|
+
const lutData = lutDataSet.elements[tag];
|
|
14
|
+
for (let i = 0; i < lutDescriptor[0]; i++) {
|
|
15
|
+
if (lutDescriptor[2] === 16) {
|
|
16
|
+
lut[i] = lutDataSet.uint16(tag, i);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
lut[i] = lutDataSet.byteArray[i + lutData.dataOffset];
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return lut;
|
|
23
|
+
}
|
|
24
|
+
function populatePaletteColorLut(dataSet, imagePixelModule) {
|
|
25
|
+
imagePixelModule.redPaletteColorLookupTableDescriptor = getLutDescriptor(dataSet, 'x00281101');
|
|
26
|
+
imagePixelModule.greenPaletteColorLookupTableDescriptor = getLutDescriptor(dataSet, 'x00281102');
|
|
27
|
+
imagePixelModule.bluePaletteColorLookupTableDescriptor = getLutDescriptor(dataSet, 'x00281103');
|
|
28
|
+
if (imagePixelModule.redPaletteColorLookupTableDescriptor[0] === 0) {
|
|
29
|
+
imagePixelModule.redPaletteColorLookupTableDescriptor[0] = 65536;
|
|
30
|
+
imagePixelModule.greenPaletteColorLookupTableDescriptor[0] = 65536;
|
|
31
|
+
imagePixelModule.bluePaletteColorLookupTableDescriptor[0] = 65536;
|
|
32
|
+
}
|
|
33
|
+
const numLutEntries = imagePixelModule.redPaletteColorLookupTableDescriptor[0];
|
|
34
|
+
const lutData = dataSet.elements.x00281201;
|
|
35
|
+
const lutBitsAllocated = lutData.length === numLutEntries ? 8 : 16;
|
|
36
|
+
if (imagePixelModule.redPaletteColorLookupTableDescriptor[2] !==
|
|
37
|
+
lutBitsAllocated) {
|
|
38
|
+
imagePixelModule.redPaletteColorLookupTableDescriptor[2] = lutBitsAllocated;
|
|
39
|
+
imagePixelModule.greenPaletteColorLookupTableDescriptor[2] =
|
|
40
|
+
lutBitsAllocated;
|
|
41
|
+
imagePixelModule.bluePaletteColorLookupTableDescriptor[2] =
|
|
42
|
+
lutBitsAllocated;
|
|
43
|
+
}
|
|
44
|
+
imagePixelModule.redPaletteColorLookupTableData = getLutData(dataSet, 'x00281201', imagePixelModule.redPaletteColorLookupTableDescriptor);
|
|
45
|
+
imagePixelModule.greenPaletteColorLookupTableData = getLutData(dataSet, 'x00281202', imagePixelModule.greenPaletteColorLookupTableDescriptor);
|
|
46
|
+
imagePixelModule.bluePaletteColorLookupTableData = getLutData(dataSet, 'x00281203', imagePixelModule.bluePaletteColorLookupTableDescriptor);
|
|
47
|
+
}
|
|
48
|
+
function populateSmallestLargestPixelValues(dataSet, imagePixelModule) {
|
|
49
|
+
const pixelRepresentation = dataSet.uint16('x00280103');
|
|
50
|
+
if (pixelRepresentation === 0) {
|
|
51
|
+
imagePixelModule.smallestPixelValue = dataSet.uint16('x00280106');
|
|
52
|
+
imagePixelModule.largestPixelValue = dataSet.uint16('x00280107');
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
imagePixelModule.smallestPixelValue = dataSet.int16('x00280106');
|
|
56
|
+
imagePixelModule.largestPixelValue = dataSet.int16('x00280107');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function getImagePixelModule(dataSet) {
|
|
60
|
+
const imagePixelModule = {
|
|
61
|
+
samplesPerPixel: dataSet.uint16('x00280002'),
|
|
62
|
+
photometricInterpretation: dataSet.string('x00280004'),
|
|
63
|
+
rows: dataSet.uint16('x00280010'),
|
|
64
|
+
columns: dataSet.uint16('x00280011'),
|
|
65
|
+
bitsAllocated: dataSet.uint16('x00280100'),
|
|
66
|
+
bitsStored: dataSet.uint16('x00280101'),
|
|
67
|
+
highBit: dataSet.uint16('x00280102'),
|
|
68
|
+
pixelRepresentation: dataSet.uint16('x00280103'),
|
|
69
|
+
planarConfiguration: dataSet.uint16('x00280006'),
|
|
70
|
+
pixelAspectRatio: dataSet.string('x00280034'),
|
|
71
|
+
};
|
|
72
|
+
populateSmallestLargestPixelValues(dataSet, imagePixelModule);
|
|
73
|
+
if (imagePixelModule.photometricInterpretation === 'PALETTE COLOR' &&
|
|
74
|
+
dataSet.elements.x00281101) {
|
|
75
|
+
populatePaletteColorLut(dataSet, imagePixelModule);
|
|
76
|
+
}
|
|
77
|
+
return imagePixelModule;
|
|
78
|
+
}
|
|
79
|
+
export default getImagePixelModule;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
function getLUT(pixelRepresentation, lutDataSet) {
|
|
2
|
+
let numLUTEntries = lutDataSet.uint16('x00283002', 0);
|
|
3
|
+
if (numLUTEntries === 0) {
|
|
4
|
+
numLUTEntries = 65535;
|
|
5
|
+
}
|
|
6
|
+
let firstValueMapped = 0;
|
|
7
|
+
if (pixelRepresentation === 0) {
|
|
8
|
+
firstValueMapped = lutDataSet.uint16('x00283002', 1);
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
firstValueMapped = lutDataSet.int16('x00283002', 1);
|
|
12
|
+
}
|
|
13
|
+
const numBitsPerEntry = lutDataSet.uint16('x00283002', 2);
|
|
14
|
+
const lut = {
|
|
15
|
+
id: '1',
|
|
16
|
+
firstValueMapped,
|
|
17
|
+
numBitsPerEntry,
|
|
18
|
+
lut: [],
|
|
19
|
+
};
|
|
20
|
+
for (let i = 0; i < numLUTEntries; i++) {
|
|
21
|
+
if (pixelRepresentation === 0) {
|
|
22
|
+
lut.lut[i] = lutDataSet.uint16('x00283006', i);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
lut.lut[i] = lutDataSet.int16('x00283006', i);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return lut;
|
|
29
|
+
}
|
|
30
|
+
function getLUTs(pixelRepresentation, lutSequence) {
|
|
31
|
+
if (!lutSequence || !lutSequence.items || !lutSequence.items.length) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const luts = [];
|
|
35
|
+
for (let i = 0; i < lutSequence.items.length; i++) {
|
|
36
|
+
const lutDataSet = lutSequence.items[i].dataSet;
|
|
37
|
+
const lut = getLUT(pixelRepresentation, lutDataSet);
|
|
38
|
+
if (lut) {
|
|
39
|
+
luts.push(lut);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return luts;
|
|
43
|
+
}
|
|
44
|
+
export default getLUTs;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
function getMinStoredPixelValue(dataSet) {
|
|
2
|
+
const pixelRepresentation = dataSet.uint16('x00280103');
|
|
3
|
+
const bitsStored = dataSet.uint16('x00280101');
|
|
4
|
+
if (pixelRepresentation === 0) {
|
|
5
|
+
return 0;
|
|
6
|
+
}
|
|
7
|
+
return -1 << (bitsStored - 1);
|
|
8
|
+
}
|
|
9
|
+
function getModalityLUTOutputPixelRepresentation(dataSet) {
|
|
10
|
+
const sopClassUID = dataSet.string('x00080016');
|
|
11
|
+
if (sopClassUID === '1.2.840.10008.5.1.4.1.1.2' ||
|
|
12
|
+
sopClassUID === '1.2.840.10008.5.1.4.1.1.2.1') {
|
|
13
|
+
return 1;
|
|
14
|
+
}
|
|
15
|
+
const rescaleIntercept = dataSet.floatString('x00281052');
|
|
16
|
+
const rescaleSlope = dataSet.floatString('x00281053');
|
|
17
|
+
if (rescaleIntercept !== undefined && rescaleSlope !== undefined) {
|
|
18
|
+
const minStoredPixelValue = getMinStoredPixelValue(dataSet);
|
|
19
|
+
const minModalityLutValue = minStoredPixelValue * rescaleSlope + rescaleIntercept;
|
|
20
|
+
if (minModalityLutValue < 0) {
|
|
21
|
+
return 1;
|
|
22
|
+
}
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
if (dataSet.elements.x00283000 && dataSet.elements.x00283000.length > 0) {
|
|
26
|
+
return 0;
|
|
27
|
+
}
|
|
28
|
+
return dataSet.uint16('x00280103');
|
|
29
|
+
}
|
|
30
|
+
export default getModalityLUTOutputPixelRepresentation;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function getNumberValues(dataSet, tag, minimumLength) {
|
|
2
|
+
const values = [];
|
|
3
|
+
const valueAsString = dataSet.string(tag);
|
|
4
|
+
if (!valueAsString) {
|
|
5
|
+
return;
|
|
6
|
+
}
|
|
7
|
+
const split = valueAsString.split('\\');
|
|
8
|
+
if (minimumLength && split.length < minimumLength) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
for (let i = 0; i < split.length; i++) {
|
|
12
|
+
values.push(parseFloat(split[i]));
|
|
13
|
+
}
|
|
14
|
+
return values;
|
|
15
|
+
}
|
|
16
|
+
export default getNumberValues;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export default function getOverlayPlaneModule(dataSet) {
|
|
2
|
+
const overlays = [];
|
|
3
|
+
for (let overlayGroup = 0x00; overlayGroup <= 0x1e; overlayGroup += 0x02) {
|
|
4
|
+
let groupStr = `x60${overlayGroup.toString(16)}`;
|
|
5
|
+
if (groupStr.length === 4) {
|
|
6
|
+
groupStr = `x600${overlayGroup.toString(16)}`;
|
|
7
|
+
}
|
|
8
|
+
const data = dataSet.elements[`${groupStr}3000`];
|
|
9
|
+
if (!data) {
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
const pixelData = [];
|
|
13
|
+
for (let i = 0; i < data.length; i++) {
|
|
14
|
+
for (let k = 0; k < 8; k++) {
|
|
15
|
+
const byte_as_int = dataSet.byteArray[data.dataOffset + i];
|
|
16
|
+
pixelData[i * 8 + k] = (byte_as_int >> k) & 0b1;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
overlays.push({
|
|
20
|
+
rows: dataSet.uint16(`${groupStr}0010`),
|
|
21
|
+
columns: dataSet.uint16(`${groupStr}0011`),
|
|
22
|
+
type: dataSet.string(`${groupStr}0040`),
|
|
23
|
+
x: dataSet.int16(`${groupStr}0050`, 1) - 1,
|
|
24
|
+
y: dataSet.int16(`${groupStr}0050`, 0) - 1,
|
|
25
|
+
pixelData,
|
|
26
|
+
description: dataSet.string(`${groupStr}0022`),
|
|
27
|
+
label: dataSet.string(`${groupStr}1500`),
|
|
28
|
+
roiArea: dataSet.string(`${groupStr}1301`),
|
|
29
|
+
roiMean: dataSet.string(`${groupStr}1302`),
|
|
30
|
+
roiStandardDeviation: dataSet.string(`${groupStr}1303`),
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
overlays,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as getImagePixelModule } from './getImagePixelModule';
|
|
2
|
+
export { default as getLUTs } from './getLUTs';
|
|
3
|
+
export { default as getModalityLUTOutputPixelRepresentation } from './getModalityLUTOutputPixelRepresentation';
|
|
4
|
+
export { default as getNumberValues } from './getNumberValues';
|
|
5
|
+
export { default as metaDataProvider, metadataForDataset, } from './metaDataProvider';
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { default as getImagePixelModule } from './getImagePixelModule';
|
|
2
|
+
export { default as getLUTs } from './getLUTs';
|
|
3
|
+
export { default as getModalityLUTOutputPixelRepresentation } from './getModalityLUTOutputPixelRepresentation';
|
|
4
|
+
export { default as getNumberValues } from './getNumberValues';
|
|
5
|
+
export { default as metaDataProvider, metadataForDataset, } from './metaDataProvider';
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { Enums } from '@cornerstonejs/core';
|
|
2
|
+
import * as dicomParser from 'dicom-parser';
|
|
3
|
+
import getNumberValues from './getNumberValues';
|
|
4
|
+
import parseImageId from '../parseImageId';
|
|
5
|
+
import dataSetCacheManager from '../dataSetCacheManager';
|
|
6
|
+
import getImagePixelModule from './getImagePixelModule';
|
|
7
|
+
import getOverlayPlaneModule from './getOverlayPlaneModule';
|
|
8
|
+
import getLUTs from './getLUTs';
|
|
9
|
+
import getModalityLUTOutputPixelRepresentation from './getModalityLUTOutputPixelRepresentation';
|
|
10
|
+
import { getDirectFrameInformation } from '../combineFrameInstanceDataset';
|
|
11
|
+
import multiframeDataset from '../retrieveMultiframeDataset';
|
|
12
|
+
import { getImageTypeSubItemFromDataset, extractOrientationFromDataset, extractPositionFromDataset, extractSpacingFromDataset, extractSliceThicknessFromDataset, } from './extractPositioningFromDataset';
|
|
13
|
+
import isNMReconstructable from '../../isNMReconstructable';
|
|
14
|
+
import { getInstanceModule, instanceModuleNames, } from '../../getInstanceModule';
|
|
15
|
+
import { getUSEnhancedRegions } from './USHelpers';
|
|
16
|
+
function metaDataProvider(type, imageId) {
|
|
17
|
+
const { MetadataModules } = Enums;
|
|
18
|
+
if (Array.isArray(imageId)) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const parsedImageId = parseImageId(imageId);
|
|
22
|
+
if (type === MetadataModules.MULTIFRAME) {
|
|
23
|
+
const multiframeData = multiframeDataset.retrieveMultiframeDataset(parsedImageId.url);
|
|
24
|
+
if (!multiframeData.dataSet) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const multiframeInfo = getDirectFrameInformation(multiframeData.dataSet, multiframeData.frame);
|
|
28
|
+
return multiframeInfo;
|
|
29
|
+
}
|
|
30
|
+
let url = parsedImageId.url;
|
|
31
|
+
if (parsedImageId.frame) {
|
|
32
|
+
url = `${url}&frame=${parsedImageId.frame}`;
|
|
33
|
+
}
|
|
34
|
+
const dataSet = dataSetCacheManager.get(url);
|
|
35
|
+
if (!dataSet) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
return metadataForDataset(type, imageId, dataSet);
|
|
39
|
+
}
|
|
40
|
+
export function metadataForDataset(type, imageId, dataSet) {
|
|
41
|
+
const { MetadataModules } = Enums;
|
|
42
|
+
if (type === MetadataModules.GENERAL_STUDY) {
|
|
43
|
+
return {
|
|
44
|
+
studyDescription: dataSet.string('x00081030'),
|
|
45
|
+
studyDate: dicomParser.parseDA(dataSet.string('x00080020')),
|
|
46
|
+
studyTime: dicomParser.parseTM(dataSet.string('x00080030') || ''),
|
|
47
|
+
accessionNumber: dataSet.string('x00080050'),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (type === MetadataModules.GENERAL_SERIES) {
|
|
51
|
+
return {
|
|
52
|
+
modality: dataSet.string('x00080060'),
|
|
53
|
+
seriesInstanceUID: dataSet.string('x0020000e'),
|
|
54
|
+
seriesNumber: dataSet.intString('x00200011'),
|
|
55
|
+
studyInstanceUID: dataSet.string('x0020000d'),
|
|
56
|
+
seriesDate: dicomParser.parseDA(dataSet.string('x00080021')),
|
|
57
|
+
seriesTime: dicomParser.parseTM(dataSet.string('x00080031') || ''),
|
|
58
|
+
acquisitionDate: dicomParser.parseDA(dataSet.string('x00080022')),
|
|
59
|
+
acquisitionTime: dicomParser.parseTM(dataSet.string('x00080032') || ''),
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (type === MetadataModules.GENERAL_IMAGE) {
|
|
63
|
+
return {
|
|
64
|
+
sopInstanceUID: dataSet.string('x00080018'),
|
|
65
|
+
instanceNumber: dataSet.intString('x00200013'),
|
|
66
|
+
lossyImageCompression: dataSet.string('x00282110'),
|
|
67
|
+
lossyImageCompressionRatio: dataSet.floatString('x00282112'),
|
|
68
|
+
lossyImageCompressionMethod: dataSet.string('x00282114'),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
if (type === MetadataModules.PATIENT) {
|
|
72
|
+
return {
|
|
73
|
+
patientID: dataSet.string('x00100020'),
|
|
74
|
+
patientName: dataSet.string('x00100010'),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
if (type === MetadataModules.PATIENT_STUDY) {
|
|
78
|
+
return {
|
|
79
|
+
patientAge: dataSet.intString('x00101010'),
|
|
80
|
+
patientSize: dataSet.floatString('x00101020'),
|
|
81
|
+
patientSex: dataSet.string('x00100040'),
|
|
82
|
+
patientWeight: dataSet.floatString('x00101030'),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
if (type === MetadataModules.NM_MULTIFRAME_GEOMETRY) {
|
|
86
|
+
const modality = dataSet.string('x00080060');
|
|
87
|
+
const imageSubType = getImageTypeSubItemFromDataset(dataSet, 2);
|
|
88
|
+
return {
|
|
89
|
+
modality,
|
|
90
|
+
imageType: dataSet.string('x00080008'),
|
|
91
|
+
imageSubType,
|
|
92
|
+
imageOrientationPatient: extractOrientationFromDataset(dataSet),
|
|
93
|
+
imagePositionPatient: extractPositionFromDataset(dataSet),
|
|
94
|
+
sliceThickness: extractSliceThicknessFromDataset(dataSet),
|
|
95
|
+
pixelSpacing: extractSpacingFromDataset(dataSet),
|
|
96
|
+
numberOfFrames: dataSet.uint16('x00280008'),
|
|
97
|
+
isNMReconstructable: isNMReconstructable(imageSubType) && modality.includes('NM'),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
if (type === MetadataModules.IMAGE_PLANE) {
|
|
101
|
+
const imageOrientationPatient = extractOrientationFromDataset(dataSet);
|
|
102
|
+
const imagePositionPatient = extractPositionFromDataset(dataSet);
|
|
103
|
+
const pixelSpacing = extractSpacingFromDataset(dataSet);
|
|
104
|
+
const sliceThickness = extractSliceThicknessFromDataset(dataSet);
|
|
105
|
+
let columnPixelSpacing = null;
|
|
106
|
+
let rowPixelSpacing = null;
|
|
107
|
+
if (pixelSpacing) {
|
|
108
|
+
rowPixelSpacing = pixelSpacing[0];
|
|
109
|
+
columnPixelSpacing = pixelSpacing[1];
|
|
110
|
+
}
|
|
111
|
+
let rowCosines = null;
|
|
112
|
+
let columnCosines = null;
|
|
113
|
+
if (imageOrientationPatient) {
|
|
114
|
+
rowCosines = [
|
|
115
|
+
parseFloat(imageOrientationPatient[0]),
|
|
116
|
+
parseFloat(imageOrientationPatient[1]),
|
|
117
|
+
parseFloat(imageOrientationPatient[2]),
|
|
118
|
+
];
|
|
119
|
+
columnCosines = [
|
|
120
|
+
parseFloat(imageOrientationPatient[3]),
|
|
121
|
+
parseFloat(imageOrientationPatient[4]),
|
|
122
|
+
parseFloat(imageOrientationPatient[5]),
|
|
123
|
+
];
|
|
124
|
+
}
|
|
125
|
+
return {
|
|
126
|
+
frameOfReferenceUID: dataSet.string('x00200052'),
|
|
127
|
+
rows: dataSet.uint16('x00280010'),
|
|
128
|
+
columns: dataSet.uint16('x00280011'),
|
|
129
|
+
imageOrientationPatient,
|
|
130
|
+
rowCosines,
|
|
131
|
+
columnCosines,
|
|
132
|
+
imagePositionPatient,
|
|
133
|
+
sliceThickness,
|
|
134
|
+
sliceLocation: dataSet.floatString('x00201041'),
|
|
135
|
+
pixelSpacing,
|
|
136
|
+
rowPixelSpacing,
|
|
137
|
+
columnPixelSpacing,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
if (type === MetadataModules.CINE) {
|
|
141
|
+
return {
|
|
142
|
+
frameTime: dataSet.floatString('x00181063'),
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
if (type === MetadataModules.IMAGE_PIXEL) {
|
|
146
|
+
return getImagePixelModule(dataSet);
|
|
147
|
+
}
|
|
148
|
+
if (type === MetadataModules.VOI_LUT) {
|
|
149
|
+
const modalityLUTOutputPixelRepresentation = getModalityLUTOutputPixelRepresentation(dataSet);
|
|
150
|
+
return {
|
|
151
|
+
windowCenter: getNumberValues(dataSet, 'x00281050', 1),
|
|
152
|
+
windowWidth: getNumberValues(dataSet, 'x00281051', 1),
|
|
153
|
+
voiLUTSequence: getLUTs(modalityLUTOutputPixelRepresentation, dataSet.elements.x00283010),
|
|
154
|
+
voiLUTFunction: dataSet.string('x00281056'),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
if (type === MetadataModules.MODALITY_LUT) {
|
|
158
|
+
return {
|
|
159
|
+
rescaleIntercept: dataSet.floatString('x00281052'),
|
|
160
|
+
rescaleSlope: dataSet.floatString('x00281053'),
|
|
161
|
+
rescaleType: dataSet.string('x00281054'),
|
|
162
|
+
modalityLUTSequence: getLUTs(dataSet.uint16('x00280103'), dataSet.elements.x00283000),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
if (type === MetadataModules.SOP_COMMON) {
|
|
166
|
+
return {
|
|
167
|
+
sopClassUID: dataSet.string('x00080016'),
|
|
168
|
+
sopInstanceUID: dataSet.string('x00080018'),
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
if (type === MetadataModules.PET_ISOTOPE) {
|
|
172
|
+
const radiopharmaceuticalInfo = dataSet.elements.x00540016;
|
|
173
|
+
if (radiopharmaceuticalInfo === undefined) {
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const firstRadiopharmaceuticalInfoDataSet = radiopharmaceuticalInfo.items[0].dataSet;
|
|
177
|
+
return {
|
|
178
|
+
radiopharmaceuticalInfo: {
|
|
179
|
+
radiopharmaceuticalStartTime: dicomParser.parseTM(firstRadiopharmaceuticalInfoDataSet.string('x00181072') || ''),
|
|
180
|
+
radionuclideTotalDose: firstRadiopharmaceuticalInfoDataSet.floatString('x00181074'),
|
|
181
|
+
radionuclideHalfLife: firstRadiopharmaceuticalInfoDataSet.floatString('x00181075'),
|
|
182
|
+
},
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
if (type === MetadataModules.OVERLAY_PLANE) {
|
|
186
|
+
return getOverlayPlaneModule(dataSet);
|
|
187
|
+
}
|
|
188
|
+
if (type === 'transferSyntax') {
|
|
189
|
+
let transferSyntaxUID;
|
|
190
|
+
try {
|
|
191
|
+
transferSyntaxUID = dataSet.string('x00020010');
|
|
192
|
+
}
|
|
193
|
+
catch (error) {
|
|
194
|
+
}
|
|
195
|
+
return {
|
|
196
|
+
transferSyntaxUID,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (type === MetadataModules.PET_SERIES) {
|
|
200
|
+
return {
|
|
201
|
+
correctedImage: dataSet.string('x00280051'),
|
|
202
|
+
units: dataSet.string('x00541001'),
|
|
203
|
+
decayCorrection: dataSet.string('x00541102'),
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (type === MetadataModules.PET_IMAGE) {
|
|
207
|
+
return {
|
|
208
|
+
frameReferenceTime: dataSet.floatString(dataSet.string('x00541300') || ''),
|
|
209
|
+
actualFrameDuration: dataSet.intString(dataSet.string('x00181242')),
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
if (type === MetadataModules.ULTRASOUND_ENHANCED_REGION) {
|
|
213
|
+
return getUSEnhancedRegions(dataSet);
|
|
214
|
+
}
|
|
215
|
+
if (type === MetadataModules.CALIBRATION) {
|
|
216
|
+
const modality = dataSet.string('x00080060');
|
|
217
|
+
if (modality === 'US') {
|
|
218
|
+
const enhancedRegion = getUSEnhancedRegions(dataSet);
|
|
219
|
+
return {
|
|
220
|
+
sequenceOfUltrasoundRegions: enhancedRegion,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (type === 'instance') {
|
|
225
|
+
return getInstanceModule(imageId, metaDataProvider, instanceModuleNames);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
export default metaDataProvider;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
function parseImageId(imageId) {
|
|
2
|
+
const firstColonIndex = imageId.indexOf(':');
|
|
3
|
+
let url = imageId.substring(firstColonIndex + 1);
|
|
4
|
+
const frameIndex = url.indexOf('frame=');
|
|
5
|
+
let frame;
|
|
6
|
+
if (frameIndex !== -1) {
|
|
7
|
+
const frameStr = url.substring(frameIndex + 6);
|
|
8
|
+
frame = parseInt(frameStr, 10);
|
|
9
|
+
url = url.substring(0, frameIndex - 1);
|
|
10
|
+
}
|
|
11
|
+
const scheme = imageId.substring(0, firstColonIndex);
|
|
12
|
+
const adjustedFrame = frame !== undefined ? frame - 1 : undefined;
|
|
13
|
+
return {
|
|
14
|
+
scheme,
|
|
15
|
+
url,
|
|
16
|
+
frame,
|
|
17
|
+
pixelDataFrame: adjustedFrame,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export default parseImageId;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function (): void;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { metaData, registerImageLoader } from '@cornerstonejs/core';
|
|
2
|
+
import { loadImage } from './loadImage';
|
|
3
|
+
import { metaDataProvider } from './metaData/index';
|
|
4
|
+
export default function () {
|
|
5
|
+
registerImageLoader('dicomweb', loadImage);
|
|
6
|
+
registerImageLoader('wadouri', loadImage);
|
|
7
|
+
registerImageLoader('dicomfile', loadImage);
|
|
8
|
+
metaData.addProvider(metaDataProvider);
|
|
9
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
declare function _get(uri: any): {
|
|
2
|
+
dataSet: import("dicom-parser").DataSet;
|
|
3
|
+
cacheCount: number;
|
|
4
|
+
};
|
|
5
|
+
declare function isMultiframeDataset(uri: any): boolean;
|
|
6
|
+
declare function retrieveMultiframeDataset(uri: any): {
|
|
7
|
+
dataSet: any;
|
|
8
|
+
frame: number;
|
|
9
|
+
};
|
|
10
|
+
declare function generateMultiframeWADOURIs(uri: any): any[];
|
|
11
|
+
declare const _default: {
|
|
12
|
+
_get: typeof _get;
|
|
13
|
+
generateMultiframeWADOURIs: typeof generateMultiframeWADOURIs;
|
|
14
|
+
retrieveMultiframeDataset: typeof retrieveMultiframeDataset;
|
|
15
|
+
isMultiframeDataset: typeof isMultiframeDataset;
|
|
16
|
+
};
|
|
17
|
+
export default _default;
|