@cornerstonejs/dicom-image-loader 2.0.0-beta.2 → 2.0.0-beta.21
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/dist/920.bundle.min.js +3 -0
- package/dist/920.bundle.min.js.LICENSE.txt +5 -0
- package/dist/920.bundle.min.js.map +1 -0
- package/dist/cornerstoneDICOMImageLoader.bundle.min.js +1 -1
- package/dist/cornerstoneDICOMImageLoader.bundle.min.js.map +1 -1
- package/dist/dynamic-import/{65916ef3def695744bda.wasm → 031089e563a18ada8441.wasm} +0 -0
- package/dist/dynamic-import/20fc4c659b85ccd2a9c0.wasm +0 -0
- package/dist/dynamic-import/584.min.js +2 -0
- package/dist/dynamic-import/584.min.js.map +1 -0
- package/dist/dynamic-import/610.min.js +2 -0
- package/dist/dynamic-import/610.min.js.map +1 -0
- package/dist/dynamic-import/918.min.js +2 -0
- package/dist/dynamic-import/918.min.js.map +1 -0
- package/dist/dynamic-import/958.min.js +3 -0
- package/dist/dynamic-import/958.min.js.LICENSE.txt +5 -0
- package/dist/dynamic-import/958.min.js.map +1 -0
- package/dist/dynamic-import/cornerstoneDICOMImageLoader.min.js +1 -1
- package/dist/dynamic-import/cornerstoneDICOMImageLoader.min.js.map +1 -1
- package/dist/esm/codecs/jpeg.d.ts +1 -0
- package/dist/esm/codecs/jpeg.js +890 -0
- package/dist/esm/codecs/jpegLossless.d.ts +7 -0
- package/dist/esm/codecs/jpegLossless.js +1219 -0
- package/dist/esm/src/constants/transferSyntaxes.d.ts +46 -0
- package/dist/esm/src/constants/transferSyntaxes.js +46 -0
- package/dist/esm/src/decodeImageFrameWorker.d.ts +1 -0
- package/dist/esm/src/decodeImageFrameWorker.js +262 -0
- package/dist/esm/src/externalModules.d.ts +5 -0
- package/dist/esm/src/externalModules.js +44 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/convertPALETTECOLOR.d.ts +3 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/convertPALETTECOLOR.js +77 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/convertRGBColorByPixel.d.ts +2 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/convertRGBColorByPixel.js +21 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/convertRGBColorByPlane.d.ts +2 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/convertRGBColorByPlane.js +28 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/convertYBRFull422ByPixel.d.ts +2 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/convertYBRFull422ByPixel.js +44 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/convertYBRFullByPixel.d.ts +2 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/convertYBRFullByPixel.js +33 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/convertYBRFullByPlane.d.ts +2 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/convertYBRFullByPlane.js +35 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/index.d.ts +7 -0
- package/dist/esm/src/imageLoader/colorSpaceConverters/index.js +7 -0
- package/dist/esm/src/imageLoader/configure.d.ts +3 -0
- package/dist/esm/src/imageLoader/configure.js +11 -0
- package/dist/esm/src/imageLoader/convertColorSpace.d.ts +1 -0
- package/dist/esm/src/imageLoader/convertColorSpace.js +40 -0
- package/dist/esm/src/imageLoader/createImage.d.ts +5 -0
- package/dist/esm/src/imageLoader/createImage.js +241 -0
- package/dist/esm/src/imageLoader/decodeImageFrame.d.ts +3 -0
- package/dist/esm/src/imageLoader/decodeImageFrame.js +63 -0
- package/dist/esm/src/imageLoader/decodeJPEGBaseline8BitColor.d.ts +4 -0
- package/dist/esm/src/imageLoader/decodeJPEGBaseline8BitColor.js +64 -0
- package/dist/esm/src/imageLoader/getImageFrame.d.ts +3 -0
- package/dist/esm/src/imageLoader/getImageFrame.js +26 -0
- package/dist/esm/src/imageLoader/getInstanceModule.d.ts +3 -0
- package/dist/esm/src/imageLoader/getInstanceModule.js +40 -0
- package/dist/esm/src/imageLoader/getMinMax.d.ts +4 -0
- package/dist/esm/src/imageLoader/getMinMax.js +15 -0
- package/dist/esm/src/imageLoader/getScalingParameters.d.ts +6 -0
- package/dist/esm/src/imageLoader/getScalingParameters.js +16 -0
- package/dist/esm/src/imageLoader/imageIdToURI.d.ts +1 -0
- package/dist/esm/src/imageLoader/imageIdToURI.js +4 -0
- package/dist/esm/src/imageLoader/index.d.ts +94 -0
- package/dist/esm/src/imageLoader/index.js +36 -0
- package/dist/esm/src/imageLoader/internal/index.d.ts +10 -0
- package/dist/esm/src/imageLoader/internal/index.js +10 -0
- package/dist/esm/src/imageLoader/internal/options.d.ts +3 -0
- package/dist/esm/src/imageLoader/internal/options.js +19 -0
- package/dist/esm/src/imageLoader/internal/rangeRequest.d.ts +9 -0
- package/dist/esm/src/imageLoader/internal/rangeRequest.js +121 -0
- package/dist/esm/src/imageLoader/internal/streamRequest.d.ts +2 -0
- package/dist/esm/src/imageLoader/internal/streamRequest.js +92 -0
- package/dist/esm/src/imageLoader/internal/xhrRequest.d.ts +3 -0
- package/dist/esm/src/imageLoader/internal/xhrRequest.js +102 -0
- package/dist/esm/src/imageLoader/isColorConversionRequired.d.ts +1 -0
- package/dist/esm/src/imageLoader/isColorConversionRequired.js +22 -0
- package/dist/esm/src/imageLoader/isJPEGBaseline8BitColor.d.ts +3 -0
- package/dist/esm/src/imageLoader/isJPEGBaseline8BitColor.js +9 -0
- package/dist/esm/src/imageLoader/isNMReconstructable.d.ts +1 -0
- package/dist/esm/src/imageLoader/isNMReconstructable.js +3 -0
- package/dist/esm/src/imageLoader/registerLoaders.d.ts +2 -0
- package/dist/esm/src/imageLoader/registerLoaders.js +7 -0
- package/dist/esm/src/imageLoader/wadors/combineFrameInstance.d.ts +12 -0
- package/dist/esm/src/imageLoader/wadors/combineFrameInstance.js +44 -0
- package/dist/esm/src/imageLoader/wadors/extractMultipart.d.ts +23 -0
- package/dist/esm/src/imageLoader/wadors/extractMultipart.js +73 -0
- package/dist/esm/src/imageLoader/wadors/findIndexOfString.d.ts +2 -0
- package/dist/esm/src/imageLoader/wadors/findIndexOfString.js +32 -0
- package/dist/esm/src/imageLoader/wadors/getImageQualityStatus.d.ts +3 -0
- package/dist/esm/src/imageLoader/wadors/getImageQualityStatus.js +8 -0
- package/dist/esm/src/imageLoader/wadors/getPixelData.d.ts +26 -0
- package/dist/esm/src/imageLoader/wadors/getPixelData.js +35 -0
- package/dist/esm/src/imageLoader/wadors/getTagValue.d.ts +1 -0
- package/dist/esm/src/imageLoader/wadors/getTagValue.js +9 -0
- package/dist/esm/src/imageLoader/wadors/index.d.ts +25 -0
- package/dist/esm/src/imageLoader/wadors/index.js +21 -0
- package/dist/esm/src/imageLoader/wadors/loadImage.d.ts +25 -0
- package/dist/esm/src/imageLoader/wadors/loadImage.js +125 -0
- package/dist/esm/src/imageLoader/wadors/loadImage_test.d.ts +1 -0
- package/dist/esm/src/imageLoader/wadors/loadImage_test.js +41 -0
- package/dist/esm/src/imageLoader/wadors/metaData/NMHelpers.d.ts +5 -0
- package/dist/esm/src/imageLoader/wadors/metaData/NMHelpers.js +38 -0
- package/dist/esm/src/imageLoader/wadors/metaData/USHelpers.d.ts +19 -0
- package/dist/esm/src/imageLoader/wadors/metaData/USHelpers.js +46 -0
- package/dist/esm/src/imageLoader/wadors/metaData/extractPositioningFromMetadata.d.ts +3 -0
- package/dist/esm/src/imageLoader/wadors/metaData/extractPositioningFromMetadata.js +18 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getFirstNumberValue.d.ts +2 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getFirstNumberValue.js +6 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getNumberString.d.ts +3 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getNumberString.js +9 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getNumberValue.d.ts +3 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getNumberValue.js +9 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getNumberValues.d.ts +3 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getNumberValues.js +20 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getOverlayPlaneModule.d.ts +4 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getOverlayPlaneModule.js +38 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getSequenceItems.d.ts +3 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getSequenceItems.js +14 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getValue.d.ts +3 -0
- package/dist/esm/src/imageLoader/wadors/metaData/getValue.js +14 -0
- package/dist/esm/src/imageLoader/wadors/metaData/index.d.ts +7 -0
- package/dist/esm/src/imageLoader/wadors/metaData/index.js +7 -0
- package/dist/esm/src/imageLoader/wadors/metaData/metaDataProvider.d.ts +14 -0
- package/dist/esm/src/imageLoader/wadors/metaData/metaDataProvider.js +261 -0
- package/dist/esm/src/imageLoader/wadors/metaDataManager.d.ts +14 -0
- package/dist/esm/src/imageLoader/wadors/metaDataManager.js +50 -0
- package/dist/esm/src/imageLoader/wadors/register.d.ts +1 -0
- package/dist/esm/src/imageLoader/wadors/register.js +6 -0
- package/dist/esm/src/imageLoader/wadors/retrieveMultiframeMetadata.d.ts +15 -0
- package/dist/esm/src/imageLoader/wadors/retrieveMultiframeMetadata.js +26 -0
- package/dist/esm/src/imageLoader/wadouri/combineFrameInstanceDataset.d.ts +22 -0
- package/dist/esm/src/imageLoader/wadouri/combineFrameInstanceDataset.js +69 -0
- package/dist/esm/src/imageLoader/wadouri/dataSetCacheManager.d.ts +31 -0
- package/dist/esm/src/imageLoader/wadouri/dataSetCacheManager.js +142 -0
- package/dist/esm/src/imageLoader/wadouri/dataSetCacheManager_test.d.ts +1 -0
- package/dist/esm/src/imageLoader/wadouri/dataSetCacheManager_test.js +10 -0
- package/dist/esm/src/imageLoader/wadouri/dataset-from-partial-content.d.ts +6 -0
- package/dist/esm/src/imageLoader/wadouri/dataset-from-partial-content.js +56 -0
- package/dist/esm/src/imageLoader/wadouri/fileManager.d.ts +11 -0
- package/dist/esm/src/imageLoader/wadouri/fileManager.js +20 -0
- package/dist/esm/src/imageLoader/wadouri/getEncapsulatedImageFrame.d.ts +2 -0
- package/dist/esm/src/imageLoader/wadouri/getEncapsulatedImageFrame.js +33 -0
- package/dist/esm/src/imageLoader/wadouri/getPixelData.d.ts +3 -0
- package/dist/esm/src/imageLoader/wadouri/getPixelData.js +13 -0
- package/dist/esm/src/imageLoader/wadouri/getUncompressedImageFrame.d.ts +3 -0
- package/dist/esm/src/imageLoader/wadouri/getUncompressedImageFrame.js +47 -0
- package/dist/esm/src/imageLoader/wadouri/index.d.ts +42 -0
- package/dist/esm/src/imageLoader/wadouri/index.js +31 -0
- package/dist/esm/src/imageLoader/wadouri/loadFileRequest.d.ts +2 -0
- package/dist/esm/src/imageLoader/wadouri/loadFileRequest.js +17 -0
- package/dist/esm/src/imageLoader/wadouri/loadImage.d.ts +9 -0
- package/dist/esm/src/imageLoader/wadouri/loadImage.js +104 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/USHelpers.d.ts +2 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/USHelpers.js +44 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/extractPositioningFromDataset.d.ts +6 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/extractPositioningFromDataset.js +80 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/getImagePixelModule.d.ts +4 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/getImagePixelModule.js +79 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/getLUTs.d.ts +4 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/getLUTs.js +44 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/getModalityLUTOutputPixelRepresentation.d.ts +3 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/getModalityLUTOutputPixelRepresentation.js +30 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/getNumberValues.d.ts +3 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/getNumberValues.js +16 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/getOverlayPlaneModule.d.ts +4 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/getOverlayPlaneModule.js +36 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/index.d.ts +5 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/index.js +5 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/metaDataProvider.d.ts +2 -0
- package/dist/esm/src/imageLoader/wadouri/metaData/metaDataProvider.js +223 -0
- package/dist/esm/src/imageLoader/wadouri/parseImageId.d.ts +8 -0
- package/dist/esm/src/imageLoader/wadouri/parseImageId.js +20 -0
- package/dist/esm/src/imageLoader/wadouri/register.d.ts +2 -0
- package/dist/esm/src/imageLoader/wadouri/register.js +8 -0
- package/dist/esm/src/imageLoader/wadouri/retrieveMultiframeDataset.d.ts +17 -0
- package/dist/esm/src/imageLoader/wadouri/retrieveMultiframeDataset.js +57 -0
- package/dist/esm/src/imageLoader/wadouri/unpackBinaryFrame.d.ts +3 -0
- package/dist/esm/src/imageLoader/wadouri/unpackBinaryFrame.js +14 -0
- package/dist/esm/src/shared/decoders/decodeBigEndian.d.ts +4 -0
- package/dist/esm/src/shared/decoders/decodeBigEndian.js +28 -0
- package/dist/esm/src/shared/decoders/decodeHTJ2K.d.ts +5 -0
- package/dist/esm/src/shared/decoders/decodeHTJ2K.js +109 -0
- package/dist/esm/src/shared/decoders/decodeJPEG2000.d.ts +5 -0
- package/dist/esm/src/shared/decoders/decodeJPEG2000.js +93 -0
- package/dist/esm/src/shared/decoders/decodeJPEGBaseline12Bit-js.d.ts +6 -0
- package/dist/esm/src/shared/decoders/decodeJPEGBaseline12Bit-js.js +34 -0
- package/dist/esm/src/shared/decoders/decodeJPEGBaseline12Bit-wasm-not-yet-working.d.ts +1 -0
- package/dist/esm/src/shared/decoders/decodeJPEGBaseline12Bit-wasm-not-yet-working.js +1 -0
- package/dist/esm/src/shared/decoders/decodeJPEGBaseline8Bit.d.ts +3 -0
- package/dist/esm/src/shared/decoders/decodeJPEGBaseline8Bit.js +62 -0
- package/dist/esm/src/shared/decoders/decodeJPEGLS.d.ts +5 -0
- package/dist/esm/src/shared/decoders/decodeJPEGLS.js +84 -0
- package/dist/esm/src/shared/decoders/decodeJPEGLossless.d.ts +6 -0
- package/dist/esm/src/shared/decoders/decodeJPEGLossless.js +39 -0
- package/dist/esm/src/shared/decoders/decodeLittleEndian.d.ts +4 -0
- package/dist/esm/src/shared/decoders/decodeLittleEndian.js +29 -0
- package/dist/esm/src/shared/decoders/decodeRLE.d.ts +4 -0
- package/dist/esm/src/shared/decoders/decodeRLE.js +128 -0
- package/dist/esm/src/shared/getMinMax.d.ts +6 -0
- package/dist/esm/src/shared/getMinMax.js +16 -0
- package/dist/esm/src/shared/getMinMax_test.d.ts +1 -0
- package/dist/esm/src/shared/getMinMax_test.js +9 -0
- package/dist/esm/src/shared/getPixelDataTypeFromMinMax.d.ts +2 -0
- package/dist/esm/src/shared/getPixelDataTypeFromMinMax.js +22 -0
- package/dist/esm/src/shared/isColorImage.d.ts +1 -0
- package/dist/esm/src/shared/isColorImage.js +10 -0
- package/dist/esm/src/shared/scaling/bilinear.d.ts +1 -0
- package/dist/esm/src/shared/scaling/bilinear.js +32 -0
- package/dist/esm/src/shared/scaling/replicate.d.ts +1 -0
- package/dist/esm/src/shared/scaling/replicate.js +20 -0
- package/dist/esm/src/shared/scaling/scaleArray.d.ts +2 -0
- package/dist/esm/src/shared/scaling/scaleArray.js +15 -0
- package/dist/esm/src/types/DICOMLoaderDataSetWithFetchMore.d.ts +9 -0
- package/dist/esm/src/types/DICOMLoaderDataSetWithFetchMore.js +1 -0
- package/dist/esm/src/types/DICOMLoaderIImage.d.ts +12 -0
- package/dist/esm/src/types/DICOMLoaderIImage.js +1 -0
- package/dist/esm/src/types/DICOMLoaderImageOptions.d.ts +23 -0
- package/dist/esm/src/types/DICOMLoaderImageOptions.js +1 -0
- package/dist/esm/src/types/LoadRequestFunction.d.ts +1 -0
- package/dist/esm/src/types/LoadRequestFunction.js +1 -0
- package/dist/esm/src/types/LoaderDecodeOptions.d.ts +2 -0
- package/dist/esm/src/types/LoaderDecodeOptions.js +1 -0
- package/dist/esm/src/types/LoaderOptions.d.ts +18 -0
- package/dist/esm/src/types/LoaderOptions.js +1 -0
- package/dist/esm/src/types/LutType.d.ts +6 -0
- package/dist/esm/src/types/LutType.js +1 -0
- package/dist/esm/src/types/WADORSMetaData.d.ts +4 -0
- package/dist/esm/src/types/WADORSMetaData.js +1 -0
- package/dist/esm/src/types/WebWorkerTypes.d.ts +64 -0
- package/dist/esm/src/types/WebWorkerTypes.js +1 -0
- package/dist/esm/src/types/XHRRequest.d.ts +16 -0
- package/dist/esm/src/types/XHRRequest.js +1 -0
- package/dist/esm/src/types/index.d.ts +11 -0
- package/dist/esm/src/types/index.js +1 -0
- package/dist/esm/src/version.d.ts +2 -0
- package/dist/esm/src/version.js +1 -0
- package/package.json +24 -17
- package/dist/cornerstoneDICOMImageLoaderNoWebWorkers.bundle.min.js +0 -2
- package/dist/cornerstoneDICOMImageLoaderNoWebWorkers.bundle.min.js.map +0 -1
- package/dist/dynamic-import/610.min.worker.js +0 -2
- package/dist/dynamic-import/610.min.worker.js.map +0 -1
- package/dist/dynamic-import/75788f12450d4c5ed494.wasm +0 -0
- package/dist/dynamic-import/945.min.worker.js +0 -2
- package/dist/dynamic-import/945.min.worker.js.map +0 -1
- package/dist/dynamic-import/index.worker.e62ecca63f1a2e124230.worker.js +0 -2
- package/dist/dynamic-import/index.worker.e62ecca63f1a2e124230.worker.js.map +0 -1
- package/dist/index.worker.bundle.min.worker.js +0 -2
- package/dist/index.worker.bundle.min.worker.js.map +0 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import external from '../../externalModules';
|
|
2
|
+
import { xhrRequest } from '../internal/index';
|
|
3
|
+
import dataSetFromPartialContent from './dataset-from-partial-content';
|
|
4
|
+
import { combineFrameInstanceDataset } from './combineFrameInstanceDataset';
|
|
5
|
+
import multiframeDataset from './retrieveMultiframeDataset';
|
|
6
|
+
let cacheSizeInBytes = 0;
|
|
7
|
+
let loadedDataSets = {};
|
|
8
|
+
let promises = {};
|
|
9
|
+
function isLoaded(uri) {
|
|
10
|
+
return loadedDataSets[uri] !== undefined;
|
|
11
|
+
}
|
|
12
|
+
function get(uri) {
|
|
13
|
+
let dataSet;
|
|
14
|
+
if (uri.includes('&frame=')) {
|
|
15
|
+
const { frame, dataSet: multiframeDataSet } = multiframeDataset.retrieveMultiframeDataset(uri);
|
|
16
|
+
dataSet = combineFrameInstanceDataset(frame, multiframeDataSet);
|
|
17
|
+
}
|
|
18
|
+
else if (loadedDataSets[uri]) {
|
|
19
|
+
dataSet = loadedDataSets[uri].dataSet;
|
|
20
|
+
}
|
|
21
|
+
return dataSet;
|
|
22
|
+
}
|
|
23
|
+
function update(uri, dataSet) {
|
|
24
|
+
const loadedDataSet = loadedDataSets[uri];
|
|
25
|
+
if (!loadedDataSet) {
|
|
26
|
+
console.error(`No loaded dataSet for uri ${uri}`);
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
cacheSizeInBytes -= loadedDataSet.dataSet.byteArray.length;
|
|
30
|
+
loadedDataSet.dataSet = dataSet;
|
|
31
|
+
cacheSizeInBytes += dataSet.byteArray.length;
|
|
32
|
+
external.cornerstone.triggerEvent(external.cornerstone.events, 'datasetscachechanged', {
|
|
33
|
+
uri,
|
|
34
|
+
action: 'updated',
|
|
35
|
+
cacheInfo: getInfo(),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
function load(uri, loadRequest = xhrRequest, imageId) {
|
|
39
|
+
const { cornerstone, dicomParser } = external;
|
|
40
|
+
if (loadedDataSets[uri]) {
|
|
41
|
+
return new Promise((resolve) => {
|
|
42
|
+
loadedDataSets[uri].cacheCount++;
|
|
43
|
+
resolve(loadedDataSets[uri].dataSet);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
if (promises[uri]) {
|
|
47
|
+
promises[uri].cacheCount++;
|
|
48
|
+
return promises[uri];
|
|
49
|
+
}
|
|
50
|
+
const loadDICOMPromise = loadRequest(uri, imageId);
|
|
51
|
+
const promise = new Promise((resolve, reject) => {
|
|
52
|
+
loadDICOMPromise
|
|
53
|
+
.then(async function (dicomPart10AsArrayBuffer) {
|
|
54
|
+
const partialContent = {
|
|
55
|
+
isPartialContent: false,
|
|
56
|
+
fileTotalLength: null,
|
|
57
|
+
};
|
|
58
|
+
if (!(dicomPart10AsArrayBuffer instanceof ArrayBuffer)) {
|
|
59
|
+
if (!dicomPart10AsArrayBuffer.arrayBuffer) {
|
|
60
|
+
return reject(new Error('If not returning ArrayBuffer, must return object with `arrayBuffer` parameter'));
|
|
61
|
+
}
|
|
62
|
+
partialContent.isPartialContent =
|
|
63
|
+
dicomPart10AsArrayBuffer.flags.isPartialContent;
|
|
64
|
+
partialContent.fileTotalLength =
|
|
65
|
+
dicomPart10AsArrayBuffer.flags.fileTotalLength;
|
|
66
|
+
dicomPart10AsArrayBuffer = dicomPart10AsArrayBuffer.arrayBuffer;
|
|
67
|
+
}
|
|
68
|
+
const byteArray = new Uint8Array(dicomPart10AsArrayBuffer);
|
|
69
|
+
let dataSet;
|
|
70
|
+
try {
|
|
71
|
+
if (partialContent.isPartialContent) {
|
|
72
|
+
dataSet = await dataSetFromPartialContent(byteArray, loadRequest, {
|
|
73
|
+
uri,
|
|
74
|
+
imageId,
|
|
75
|
+
fileTotalLength: partialContent.fileTotalLength,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
dataSet = dicomParser.parseDicom(byteArray);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
return reject(error);
|
|
84
|
+
}
|
|
85
|
+
loadedDataSets[uri] = {
|
|
86
|
+
dataSet,
|
|
87
|
+
cacheCount: promise.cacheCount,
|
|
88
|
+
};
|
|
89
|
+
cacheSizeInBytes += dataSet.byteArray.length;
|
|
90
|
+
resolve(dataSet);
|
|
91
|
+
cornerstone.triggerEvent(cornerstone.events, 'datasetscachechanged', {
|
|
92
|
+
uri,
|
|
93
|
+
action: 'loaded',
|
|
94
|
+
cacheInfo: getInfo(),
|
|
95
|
+
});
|
|
96
|
+
}, reject)
|
|
97
|
+
.then(() => {
|
|
98
|
+
delete promises[uri];
|
|
99
|
+
}, () => {
|
|
100
|
+
delete promises[uri];
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
promise.cacheCount = 1;
|
|
104
|
+
promises[uri] = promise;
|
|
105
|
+
return promise;
|
|
106
|
+
}
|
|
107
|
+
function unload(uri) {
|
|
108
|
+
const { cornerstone } = external;
|
|
109
|
+
if (loadedDataSets[uri]) {
|
|
110
|
+
loadedDataSets[uri].cacheCount--;
|
|
111
|
+
if (loadedDataSets[uri].cacheCount === 0) {
|
|
112
|
+
cacheSizeInBytes -= loadedDataSets[uri].dataSet.byteArray.length;
|
|
113
|
+
delete loadedDataSets[uri];
|
|
114
|
+
cornerstone.triggerEvent(cornerstone.events, 'datasetscachechanged', {
|
|
115
|
+
uri,
|
|
116
|
+
action: 'unloaded',
|
|
117
|
+
cacheInfo: getInfo(),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
export function getInfo() {
|
|
123
|
+
return {
|
|
124
|
+
cacheSizeInBytes,
|
|
125
|
+
numberOfDataSetsCached: Object.keys(loadedDataSets).length,
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
function purge() {
|
|
129
|
+
loadedDataSets = {};
|
|
130
|
+
promises = {};
|
|
131
|
+
cacheSizeInBytes = 0;
|
|
132
|
+
}
|
|
133
|
+
export default {
|
|
134
|
+
isLoaded,
|
|
135
|
+
load,
|
|
136
|
+
unload,
|
|
137
|
+
getInfo,
|
|
138
|
+
purge,
|
|
139
|
+
get,
|
|
140
|
+
update,
|
|
141
|
+
};
|
|
142
|
+
export { loadedDataSets };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { expect } from 'chai';
|
|
2
|
+
import dataSetCacheManager from './dataSetCacheManager';
|
|
3
|
+
describe('#getInfo', () => {
|
|
4
|
+
it('should return cache info for an empty cache', function () {
|
|
5
|
+
dataSetCacheManager.purge();
|
|
6
|
+
const cacheInfo = dataSetCacheManager.getInfo();
|
|
7
|
+
expect(cacheInfo.cacheSizeInBytes).to.be.equal(0);
|
|
8
|
+
expect(cacheInfo.numberOfDataSetsCached).to.be.equal(0);
|
|
9
|
+
});
|
|
10
|
+
});
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { LoadRequestFunction, DICOMLoaderDataSetWithFetchMore } from '../../types';
|
|
2
|
+
export default function dataSetFromPartialContent(byteArray: Uint8Array, loadRequest: LoadRequestFunction, metadata: {
|
|
3
|
+
uri: string;
|
|
4
|
+
imageId: string;
|
|
5
|
+
fileTotalLength: number | null;
|
|
6
|
+
}): Promise<DICOMLoaderDataSetWithFetchMore>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import external from '../../externalModules';
|
|
2
|
+
function fixFragments(dataSet) {
|
|
3
|
+
const fragments = dataSet.elements.x7fe00010.fragments;
|
|
4
|
+
const totalLength = dataSet.byteArray.length;
|
|
5
|
+
for (const fragment of fragments) {
|
|
6
|
+
const { position, length } = fragment;
|
|
7
|
+
if (length > totalLength - position) {
|
|
8
|
+
console.log(`Truncated fragment, changing fragment length from ${fragment.length} to ${totalLength - position}`);
|
|
9
|
+
fragment.length = totalLength - position;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return dataSet;
|
|
13
|
+
}
|
|
14
|
+
function parsePartialByteArray(byteArray) {
|
|
15
|
+
const { dicomParser } = external;
|
|
16
|
+
let dataSet = dicomParser.parseDicom(byteArray, {
|
|
17
|
+
untilTag: 'x7fe00010',
|
|
18
|
+
});
|
|
19
|
+
if (!dataSet.elements.x7fe00010) {
|
|
20
|
+
console.warn('Pixel data not found!');
|
|
21
|
+
}
|
|
22
|
+
let pixelDataSet;
|
|
23
|
+
try {
|
|
24
|
+
pixelDataSet = dicomParser.parseDicom(byteArray);
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
console.error(err);
|
|
28
|
+
console.log('pixel data dataset:', err.dataSet);
|
|
29
|
+
pixelDataSet = err.dataSet;
|
|
30
|
+
}
|
|
31
|
+
dataSet.elements.x7fe00010 = pixelDataSet.elements.x7fe00010;
|
|
32
|
+
dataSet = fixFragments(dataSet);
|
|
33
|
+
return dataSet;
|
|
34
|
+
}
|
|
35
|
+
export default async function dataSetFromPartialContent(byteArray, loadRequest, metadata) {
|
|
36
|
+
const dataSet = parsePartialByteArray(byteArray);
|
|
37
|
+
const { uri, imageId, fileTotalLength } = metadata;
|
|
38
|
+
dataSet.fetchMore = async function (fetchOptions) {
|
|
39
|
+
const _options = Object.assign({
|
|
40
|
+
uri,
|
|
41
|
+
imageId,
|
|
42
|
+
fetchedLength: byteArray.length,
|
|
43
|
+
lengthToFetch: fileTotalLength - byteArray.length,
|
|
44
|
+
}, fetchOptions);
|
|
45
|
+
const { fetchedLength, lengthToFetch } = _options;
|
|
46
|
+
const { arrayBuffer } = await loadRequest(uri, imageId, {
|
|
47
|
+
byteRange: `${fetchedLength}-${fetchedLength + lengthToFetch}`,
|
|
48
|
+
});
|
|
49
|
+
const byteArrayToAppend = new Uint8Array(arrayBuffer);
|
|
50
|
+
const combinedByteArray = new Uint8Array(dataSet.byteArray.length + byteArrayToAppend.length);
|
|
51
|
+
combinedByteArray.set(dataSet.byteArray);
|
|
52
|
+
combinedByteArray.set(byteArrayToAppend, dataSet.byteArray.length);
|
|
53
|
+
return dataSetFromPartialContent(combinedByteArray, loadRequest, metadata);
|
|
54
|
+
};
|
|
55
|
+
return dataSet;
|
|
56
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
declare function add(file: Blob): string;
|
|
2
|
+
declare function get(index: number): Blob;
|
|
3
|
+
declare function remove(index: number): void;
|
|
4
|
+
declare function purge(): void;
|
|
5
|
+
declare const _default: {
|
|
6
|
+
add: typeof add;
|
|
7
|
+
get: typeof get;
|
|
8
|
+
remove: typeof remove;
|
|
9
|
+
purge: typeof purge;
|
|
10
|
+
};
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
let files = [];
|
|
2
|
+
function add(file) {
|
|
3
|
+
const fileIndex = files.push(file);
|
|
4
|
+
return `dicomfile:${fileIndex - 1}`;
|
|
5
|
+
}
|
|
6
|
+
function get(index) {
|
|
7
|
+
return files[index];
|
|
8
|
+
}
|
|
9
|
+
function remove(index) {
|
|
10
|
+
files[index] = undefined;
|
|
11
|
+
}
|
|
12
|
+
function purge() {
|
|
13
|
+
files = [];
|
|
14
|
+
}
|
|
15
|
+
export default {
|
|
16
|
+
add,
|
|
17
|
+
get,
|
|
18
|
+
remove,
|
|
19
|
+
purge,
|
|
20
|
+
};
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ByteStream, readSequenceItem } from 'dicom-parser';
|
|
2
|
+
import external from '../../externalModules';
|
|
3
|
+
function framesAreFragmented(dataSet) {
|
|
4
|
+
const numberOfFrames = dataSet.intString('x00280008');
|
|
5
|
+
const pixelDataElement = dataSet.elements.x7fe00010;
|
|
6
|
+
return numberOfFrames !== pixelDataElement.fragments.length;
|
|
7
|
+
}
|
|
8
|
+
export default function getEncapsulatedImageFrame(dataSet, frameIndex) {
|
|
9
|
+
const { dicomParser } = external;
|
|
10
|
+
if (dataSet.elements.x7fe00010 &&
|
|
11
|
+
dataSet.elements.x7fe00010.basicOffsetTable.length) {
|
|
12
|
+
return dicomParser.readEncapsulatedImageFrame(dataSet, dataSet.elements.x7fe00010, frameIndex);
|
|
13
|
+
}
|
|
14
|
+
if (framesAreFragmented(dataSet)) {
|
|
15
|
+
const basicOffsetTable = dicomParser.createJPEGBasicOffsetTable(dataSet, dataSet.elements.x7fe00010);
|
|
16
|
+
return dicomParser.readEncapsulatedImageFrame(dataSet, dataSet.elements.x7fe00010, frameIndex, basicOffsetTable);
|
|
17
|
+
}
|
|
18
|
+
const fragments = dataSet.elements.x7fe00010.fragments;
|
|
19
|
+
const byteStream = new ByteStream(dataSet.byteArrayParser, dataSet.byteArray, dataSet.elements.x7fe00010.dataOffset);
|
|
20
|
+
const basicOffsetTable = readSequenceItem(byteStream);
|
|
21
|
+
if (basicOffsetTable.tag !== 'xfffee000') {
|
|
22
|
+
throw 'dicomParser.readEncapsulatedPixelData: missing basic offset table xfffee000';
|
|
23
|
+
}
|
|
24
|
+
byteStream.seek(basicOffsetTable.length);
|
|
25
|
+
const fragmentZeroPosition = byteStream.position;
|
|
26
|
+
if (frameIndex + 1 > fragments.length) {
|
|
27
|
+
throw 'dicomParser.readEncapsulatedPixelData: frame exceeds number of fragments';
|
|
28
|
+
}
|
|
29
|
+
const fragmentHeaderSize = 8;
|
|
30
|
+
const byteOffset = fragmentZeroPosition + fragments[frameIndex].offset + fragmentHeaderSize;
|
|
31
|
+
const length = fragments[frameIndex].length;
|
|
32
|
+
return new Uint8Array(byteStream.byteArray.buffer.slice(byteStream.byteArray.byteOffset + byteOffset, byteStream.byteArray.byteOffset + byteOffset + length));
|
|
33
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import getEncapsulatedImageFrame from './getEncapsulatedImageFrame';
|
|
2
|
+
import getUncompressedImageFrame from './getUncompressedImageFrame';
|
|
3
|
+
function getPixelData(dataSet, frameIndex = 0) {
|
|
4
|
+
const pixelDataElement = dataSet.elements.x7fe00010 || dataSet.elements.x7fe00008;
|
|
5
|
+
if (!pixelDataElement) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
if (pixelDataElement.encapsulatedPixelData) {
|
|
9
|
+
return getEncapsulatedImageFrame(dataSet, frameIndex);
|
|
10
|
+
}
|
|
11
|
+
return getUncompressedImageFrame(dataSet, frameIndex);
|
|
12
|
+
}
|
|
13
|
+
export default getPixelData;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import unpackBinaryFrame from './unpackBinaryFrame';
|
|
2
|
+
function getUncompressedImageFrame(dataSet, frameIndex) {
|
|
3
|
+
const pixelDataElement = dataSet.elements.x7fe00010 || dataSet.elements.x7fe00008;
|
|
4
|
+
const bitsAllocated = dataSet.uint16('x00280100');
|
|
5
|
+
const rows = dataSet.uint16('x00280010');
|
|
6
|
+
const columns = dataSet.uint16('x00280011');
|
|
7
|
+
let samplesPerPixel = dataSet.uint16('x00280002');
|
|
8
|
+
const photometricInterpretation = dataSet.string('x00280004');
|
|
9
|
+
if (photometricInterpretation === 'YBR_FULL_422') {
|
|
10
|
+
samplesPerPixel = 2;
|
|
11
|
+
console.warn(`Using SamplesPerPixel of 2 for YBR_FULL_422 photometric interpretation.
|
|
12
|
+
See http://dicom.nema.org/medical/dicom/current/output/chtml/part03/sect_C.7.6.3.html for more information.`);
|
|
13
|
+
}
|
|
14
|
+
const pixelDataOffset = pixelDataElement.dataOffset;
|
|
15
|
+
const pixelsPerFrame = rows * columns * samplesPerPixel;
|
|
16
|
+
let frameOffset;
|
|
17
|
+
if (bitsAllocated === 8) {
|
|
18
|
+
frameOffset = pixelDataOffset + frameIndex * pixelsPerFrame;
|
|
19
|
+
if (frameOffset >= dataSet.byteArray.length) {
|
|
20
|
+
throw new Error('frame exceeds size of pixelData');
|
|
21
|
+
}
|
|
22
|
+
return new Uint8Array(dataSet.byteArray.buffer.slice(frameOffset, frameOffset + pixelsPerFrame));
|
|
23
|
+
}
|
|
24
|
+
else if (bitsAllocated === 16) {
|
|
25
|
+
frameOffset = pixelDataOffset + frameIndex * pixelsPerFrame * 2;
|
|
26
|
+
if (frameOffset >= dataSet.byteArray.length) {
|
|
27
|
+
throw new Error('frame exceeds size of pixelData');
|
|
28
|
+
}
|
|
29
|
+
return new Uint8Array(dataSet.byteArray.buffer.slice(frameOffset, frameOffset + pixelsPerFrame * 2));
|
|
30
|
+
}
|
|
31
|
+
else if (bitsAllocated === 1) {
|
|
32
|
+
frameOffset = pixelDataOffset + frameIndex * pixelsPerFrame * 0.125;
|
|
33
|
+
if (frameOffset >= dataSet.byteArray.length) {
|
|
34
|
+
throw new Error('frame exceeds size of pixelData');
|
|
35
|
+
}
|
|
36
|
+
return unpackBinaryFrame(dataSet.byteArray, frameOffset, pixelsPerFrame);
|
|
37
|
+
}
|
|
38
|
+
else if (bitsAllocated === 32) {
|
|
39
|
+
frameOffset = pixelDataOffset + frameIndex * pixelsPerFrame * 4;
|
|
40
|
+
if (frameOffset >= dataSet.byteArray.length) {
|
|
41
|
+
throw new Error('frame exceeds size of pixelData');
|
|
42
|
+
}
|
|
43
|
+
return new Uint8Array(dataSet.byteArray.buffer.slice(frameOffset, frameOffset + pixelsPerFrame * 4));
|
|
44
|
+
}
|
|
45
|
+
throw new Error('unsupported pixel format');
|
|
46
|
+
}
|
|
47
|
+
export default getUncompressedImageFrame;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { getImagePixelModule, getLUTs, getModalityLUTOutputPixelRepresentation, getNumberValues, metaDataProvider } from './metaData/index';
|
|
2
|
+
import getEncapsulatedImageFrame from './getEncapsulatedImageFrame';
|
|
3
|
+
import getUncompressedImageFrame from './getUncompressedImageFrame';
|
|
4
|
+
import loadFileRequest from './loadFileRequest';
|
|
5
|
+
import { loadImageFromPromise, getLoaderForScheme, loadImage } from './loadImage';
|
|
6
|
+
import parseImageId from './parseImageId';
|
|
7
|
+
import unpackBinaryFrame from './unpackBinaryFrame';
|
|
8
|
+
import register from './register';
|
|
9
|
+
declare const _default: {
|
|
10
|
+
metaData: {
|
|
11
|
+
getImagePixelModule: typeof getImagePixelModule;
|
|
12
|
+
getLUTs: typeof getLUTs;
|
|
13
|
+
getModalityLUTOutputPixelRepresentation: typeof getModalityLUTOutputPixelRepresentation;
|
|
14
|
+
getNumberValues: typeof getNumberValues;
|
|
15
|
+
metaDataProvider: typeof metaDataProvider;
|
|
16
|
+
};
|
|
17
|
+
dataSetCacheManager: {
|
|
18
|
+
isLoaded: (uri: string) => boolean;
|
|
19
|
+
load: (uri: string, loadRequest: import("../../types").LoadRequestFunction, imageId: string) => import("./dataSetCacheManager").CornerstoneWadoLoaderCachedPromise;
|
|
20
|
+
unload: (uri: string) => void;
|
|
21
|
+
getInfo: typeof import("./dataSetCacheManager").getInfo;
|
|
22
|
+
purge: () => void;
|
|
23
|
+
get: (uri: string) => import("dicom-parser").DataSet;
|
|
24
|
+
update: (uri: string, dataSet: import("dicom-parser").DataSet) => void;
|
|
25
|
+
};
|
|
26
|
+
fileManager: {
|
|
27
|
+
add: (file: Blob) => string;
|
|
28
|
+
get: (index: number) => Blob;
|
|
29
|
+
remove: (index: number) => void;
|
|
30
|
+
purge: () => void;
|
|
31
|
+
};
|
|
32
|
+
getEncapsulatedImageFrame: typeof getEncapsulatedImageFrame;
|
|
33
|
+
getUncompressedImageFrame: typeof getUncompressedImageFrame;
|
|
34
|
+
loadFileRequest: typeof loadFileRequest;
|
|
35
|
+
loadImageFromPromise: typeof loadImageFromPromise;
|
|
36
|
+
getLoaderForScheme: typeof getLoaderForScheme;
|
|
37
|
+
loadImage: typeof loadImage;
|
|
38
|
+
parseImageId: typeof parseImageId;
|
|
39
|
+
unpackBinaryFrame: typeof unpackBinaryFrame;
|
|
40
|
+
register: typeof register;
|
|
41
|
+
};
|
|
42
|
+
export default _default;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { getImagePixelModule, getLUTs, getModalityLUTOutputPixelRepresentation, getNumberValues, metaDataProvider, } from './metaData/index';
|
|
2
|
+
import dataSetCacheManager from './dataSetCacheManager';
|
|
3
|
+
import fileManager from './fileManager';
|
|
4
|
+
import getEncapsulatedImageFrame from './getEncapsulatedImageFrame';
|
|
5
|
+
import getUncompressedImageFrame from './getUncompressedImageFrame';
|
|
6
|
+
import loadFileRequest from './loadFileRequest';
|
|
7
|
+
import { loadImageFromPromise, getLoaderForScheme, loadImage, } from './loadImage';
|
|
8
|
+
import parseImageId from './parseImageId';
|
|
9
|
+
import unpackBinaryFrame from './unpackBinaryFrame';
|
|
10
|
+
import register from './register';
|
|
11
|
+
const metaData = {
|
|
12
|
+
getImagePixelModule,
|
|
13
|
+
getLUTs,
|
|
14
|
+
getModalityLUTOutputPixelRepresentation,
|
|
15
|
+
getNumberValues,
|
|
16
|
+
metaDataProvider,
|
|
17
|
+
};
|
|
18
|
+
export default {
|
|
19
|
+
metaData,
|
|
20
|
+
dataSetCacheManager,
|
|
21
|
+
fileManager,
|
|
22
|
+
getEncapsulatedImageFrame,
|
|
23
|
+
getUncompressedImageFrame,
|
|
24
|
+
loadFileRequest,
|
|
25
|
+
loadImageFromPromise,
|
|
26
|
+
getLoaderForScheme,
|
|
27
|
+
loadImage,
|
|
28
|
+
parseImageId,
|
|
29
|
+
unpackBinaryFrame,
|
|
30
|
+
register,
|
|
31
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import parseImageId from './parseImageId';
|
|
2
|
+
import fileManager from './fileManager';
|
|
3
|
+
function loadFileRequest(uri) {
|
|
4
|
+
const parsedImageId = parseImageId(uri);
|
|
5
|
+
const fileIndex = parseInt(parsedImageId.url, 10);
|
|
6
|
+
const file = fileManager.get(fileIndex);
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
const fileReader = new FileReader();
|
|
9
|
+
fileReader.onload = (e) => {
|
|
10
|
+
const dicomPart10AsArrayBuffer = e.target.result;
|
|
11
|
+
resolve(dicomPart10AsArrayBuffer);
|
|
12
|
+
};
|
|
13
|
+
fileReader.onerror = reject;
|
|
14
|
+
fileReader.readAsArrayBuffer(file);
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
export default loadFileRequest;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { DataSet } from 'dicom-parser';
|
|
2
|
+
import type { Types } from '@cornerstonejs/core';
|
|
3
|
+
import type { LoadRequestFunction, DICOMLoaderIImage, DICOMLoaderImageOptions } from '../../types';
|
|
4
|
+
declare function loadImageFromPromise(dataSetPromise: Promise<DataSet>, imageId: string, frame: number, sharedCacheKey: string, options: DICOMLoaderImageOptions, callbacks?: {
|
|
5
|
+
imageDoneCallback: (image: DICOMLoaderIImage) => void;
|
|
6
|
+
}): Types.IImageLoadObject;
|
|
7
|
+
declare function getLoaderForScheme(scheme: string): LoadRequestFunction;
|
|
8
|
+
declare function loadImage(imageId: string, options?: DICOMLoaderImageOptions): Types.IImageLoadObject;
|
|
9
|
+
export { loadImageFromPromise, getLoaderForScheme, loadImage };
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import createImage from '../createImage';
|
|
2
|
+
import { xhrRequest } from '../internal/index';
|
|
3
|
+
import dataSetCacheManager from './dataSetCacheManager';
|
|
4
|
+
import getPixelData from './getPixelData';
|
|
5
|
+
import loadFileRequest from './loadFileRequest';
|
|
6
|
+
import parseImageId from './parseImageId';
|
|
7
|
+
function addDecache(imageLoadObject, imageId) {
|
|
8
|
+
imageLoadObject.decache = function () {
|
|
9
|
+
const parsedImageId = parseImageId(imageId);
|
|
10
|
+
dataSetCacheManager.unload(parsedImageId.url);
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
function loadImageFromPromise(dataSetPromise, imageId, frame = 0, sharedCacheKey, options, callbacks) {
|
|
14
|
+
const start = new Date().getTime();
|
|
15
|
+
const imageLoadObject = {
|
|
16
|
+
cancelFn: undefined,
|
|
17
|
+
promise: undefined,
|
|
18
|
+
};
|
|
19
|
+
imageLoadObject.promise = new Promise((resolve, reject) => {
|
|
20
|
+
dataSetPromise.then((dataSet) => {
|
|
21
|
+
const pixelData = getPixelData(dataSet, frame);
|
|
22
|
+
const transferSyntax = dataSet.string('x00020010');
|
|
23
|
+
const loadEnd = new Date().getTime();
|
|
24
|
+
const imagePromise = createImage(imageId, pixelData, transferSyntax, options);
|
|
25
|
+
addDecache(imageLoadObject, imageId);
|
|
26
|
+
imagePromise.then((image) => {
|
|
27
|
+
image = image;
|
|
28
|
+
image.data = dataSet;
|
|
29
|
+
image.sharedCacheKey = sharedCacheKey;
|
|
30
|
+
const end = new Date().getTime();
|
|
31
|
+
image.loadTimeInMS = loadEnd - start;
|
|
32
|
+
image.totalTimeInMS = end - start;
|
|
33
|
+
if (callbacks !== undefined &&
|
|
34
|
+
callbacks.imageDoneCallback !== undefined) {
|
|
35
|
+
callbacks.imageDoneCallback(image);
|
|
36
|
+
}
|
|
37
|
+
resolve(image);
|
|
38
|
+
}, function (error) {
|
|
39
|
+
reject({
|
|
40
|
+
error,
|
|
41
|
+
dataSet,
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
}, function (error) {
|
|
45
|
+
reject({
|
|
46
|
+
error,
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
return imageLoadObject;
|
|
51
|
+
}
|
|
52
|
+
function loadImageFromDataSet(dataSet, imageId, frame = 0, sharedCacheKey, options) {
|
|
53
|
+
const start = new Date().getTime();
|
|
54
|
+
const promise = new Promise((resolve, reject) => {
|
|
55
|
+
const loadEnd = new Date().getTime();
|
|
56
|
+
let imagePromise;
|
|
57
|
+
try {
|
|
58
|
+
const pixelData = getPixelData(dataSet, frame);
|
|
59
|
+
const transferSyntax = dataSet.string('x00020010');
|
|
60
|
+
imagePromise = createImage(imageId, pixelData, transferSyntax, options);
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
reject({
|
|
64
|
+
error,
|
|
65
|
+
dataSet,
|
|
66
|
+
});
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
imagePromise.then((image) => {
|
|
70
|
+
image = image;
|
|
71
|
+
image.data = dataSet;
|
|
72
|
+
image.sharedCacheKey = sharedCacheKey;
|
|
73
|
+
const end = new Date().getTime();
|
|
74
|
+
image.loadTimeInMS = loadEnd - start;
|
|
75
|
+
image.totalTimeInMS = end - start;
|
|
76
|
+
resolve(image);
|
|
77
|
+
}, reject);
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
promise: promise,
|
|
81
|
+
cancelFn: undefined,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
function getLoaderForScheme(scheme) {
|
|
85
|
+
if (scheme === 'dicomweb' || scheme === 'wadouri') {
|
|
86
|
+
return xhrRequest;
|
|
87
|
+
}
|
|
88
|
+
else if (scheme === 'dicomfile') {
|
|
89
|
+
return loadFileRequest;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function loadImage(imageId, options = {}) {
|
|
93
|
+
const parsedImageId = parseImageId(imageId);
|
|
94
|
+
options = Object.assign({}, options);
|
|
95
|
+
delete options.loader;
|
|
96
|
+
const schemeLoader = getLoaderForScheme(parsedImageId.scheme);
|
|
97
|
+
if (dataSetCacheManager.isLoaded(parsedImageId.url)) {
|
|
98
|
+
const dataSet = dataSetCacheManager.get(parsedImageId.url, schemeLoader, imageId);
|
|
99
|
+
return loadImageFromDataSet(dataSet, imageId, parsedImageId.pixelDataFrame, parsedImageId.url, options);
|
|
100
|
+
}
|
|
101
|
+
const dataSetPromise = dataSetCacheManager.load(parsedImageId.url, schemeLoader, imageId);
|
|
102
|
+
return loadImageFromPromise(dataSetPromise, imageId, parsedImageId.frame, parsedImageId.url, options);
|
|
103
|
+
}
|
|
104
|
+
export { loadImageFromPromise, getLoaderForScheme, loadImage };
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
function getUSEnhancedRegions(metadata) {
|
|
2
|
+
const sequence = metadata.elements['x00186011'];
|
|
3
|
+
if (!sequence || !sequence.items) {
|
|
4
|
+
return [];
|
|
5
|
+
}
|
|
6
|
+
const regions = sequence.items.map((item) => {
|
|
7
|
+
const physicalDeltaX = item.dataSet.double('x0018602c');
|
|
8
|
+
const physicalDeltaY = item.dataSet.double('x0018602e');
|
|
9
|
+
const physicalUnitsXDirection = item.dataSet.uint16('x00186024');
|
|
10
|
+
const physicalUnitsYDirection = item.dataSet.uint16('x00186026');
|
|
11
|
+
const regionLocationMinY0 = item.dataSet.uint16('x0018601a');
|
|
12
|
+
const regionLocationMaxY1 = item.dataSet.uint16('x0018601e');
|
|
13
|
+
const regionLocationMinX0 = item.dataSet.uint16('x00186018');
|
|
14
|
+
const regionLocationMaxX1 = item.dataSet.uint16('x0018601c');
|
|
15
|
+
const referencePixelX0 = item.dataSet.int32('x00186020') || null;
|
|
16
|
+
const referencePixelY0 = item.dataSet.int32('x00186022') || null;
|
|
17
|
+
const referencePhysicalPixelValueY = item.dataSet.uint16('x0018602a');
|
|
18
|
+
const referencePhysicalPixelValueX = item.dataSet.uint16('x00186028');
|
|
19
|
+
const regionSpatialFormat = item.dataSet.uint16('x00186012');
|
|
20
|
+
const regionDataType = item.dataSet.uint16('x00186014');
|
|
21
|
+
const regionFlags = item.dataSet.uint16('x00186016');
|
|
22
|
+
const transducerFrequency = item.dataSet.uint16('x00186030');
|
|
23
|
+
return {
|
|
24
|
+
regionLocationMinY0,
|
|
25
|
+
regionLocationMaxY1,
|
|
26
|
+
regionLocationMinX0,
|
|
27
|
+
regionLocationMaxX1,
|
|
28
|
+
referencePixelX0,
|
|
29
|
+
referencePixelY0,
|
|
30
|
+
physicalDeltaX,
|
|
31
|
+
physicalDeltaY,
|
|
32
|
+
physicalUnitsXDirection,
|
|
33
|
+
physicalUnitsYDirection,
|
|
34
|
+
referencePhysicalPixelValueY,
|
|
35
|
+
referencePhysicalPixelValueX,
|
|
36
|
+
regionSpatialFormat,
|
|
37
|
+
regionDataType,
|
|
38
|
+
regionFlags,
|
|
39
|
+
transducerFrequency,
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
return regions;
|
|
43
|
+
}
|
|
44
|
+
export { getUSEnhancedRegions };
|
|
@@ -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, };
|