@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,35 @@
|
|
|
1
|
+
export default function (imageFrame, colorBuffer, useRGBA) {
|
|
2
|
+
if (imageFrame === undefined) {
|
|
3
|
+
throw new Error('convertYBRFullByPlane: ybrBuffer must be defined');
|
|
4
|
+
}
|
|
5
|
+
if (imageFrame.length % 3 !== 0) {
|
|
6
|
+
throw new Error(`convertYBRFullByPlane: ybrBuffer length ${imageFrame.length} must be divisible by 3`);
|
|
7
|
+
}
|
|
8
|
+
const numPixels = imageFrame.length / 3;
|
|
9
|
+
let bufferIndex = 0;
|
|
10
|
+
let yIndex = 0;
|
|
11
|
+
let cbIndex = numPixels;
|
|
12
|
+
let crIndex = numPixels * 2;
|
|
13
|
+
if (useRGBA) {
|
|
14
|
+
for (let i = 0; i < numPixels; i++) {
|
|
15
|
+
const y = imageFrame[yIndex++];
|
|
16
|
+
const cb = imageFrame[cbIndex++];
|
|
17
|
+
const cr = imageFrame[crIndex++];
|
|
18
|
+
colorBuffer[bufferIndex++] = y + 1.402 * (cr - 128);
|
|
19
|
+
colorBuffer[bufferIndex++] =
|
|
20
|
+
y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128);
|
|
21
|
+
colorBuffer[bufferIndex++] = y + 1.772 * (cb - 128);
|
|
22
|
+
colorBuffer[bufferIndex++] = 255;
|
|
23
|
+
}
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
for (let i = 0; i < numPixels; i++) {
|
|
27
|
+
const y = imageFrame[yIndex++];
|
|
28
|
+
const cb = imageFrame[cbIndex++];
|
|
29
|
+
const cr = imageFrame[crIndex++];
|
|
30
|
+
colorBuffer[bufferIndex++] = y + 1.402 * (cr - 128);
|
|
31
|
+
colorBuffer[bufferIndex++] =
|
|
32
|
+
y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128);
|
|
33
|
+
colorBuffer[bufferIndex++] = y + 1.772 * (cb - 128);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { default as convertRGBColorByPixel } from './convertRGBColorByPixel';
|
|
2
|
+
import { default as convertRGBColorByPlane } from './convertRGBColorByPlane';
|
|
3
|
+
import { default as convertYBRFullByPixel } from './convertYBRFullByPixel';
|
|
4
|
+
import { default as convertYBRFullByPlane } from './convertYBRFullByPlane';
|
|
5
|
+
import { default as convertYBRFull422ByPixel } from './convertYBRFull422ByPixel';
|
|
6
|
+
import { default as convertPALETTECOLOR } from './convertPALETTECOLOR';
|
|
7
|
+
export { convertRGBColorByPixel, convertRGBColorByPlane, convertYBRFullByPixel, convertYBRFullByPlane, convertYBRFull422ByPixel, convertPALETTECOLOR, };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { default as convertRGBColorByPixel } from './convertRGBColorByPixel';
|
|
2
|
+
import { default as convertRGBColorByPlane } from './convertRGBColorByPlane';
|
|
3
|
+
import { default as convertYBRFullByPixel } from './convertYBRFullByPixel';
|
|
4
|
+
import { default as convertYBRFullByPlane } from './convertYBRFullByPlane';
|
|
5
|
+
import { default as convertYBRFull422ByPixel } from './convertYBRFull422ByPixel';
|
|
6
|
+
import { default as convertPALETTECOLOR } from './convertPALETTECOLOR';
|
|
7
|
+
export { convertRGBColorByPixel, convertRGBColorByPlane, convertYBRFullByPixel, convertYBRFullByPlane, convertYBRFull422ByPixel, convertPALETTECOLOR, };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { setOptions } from './internal/index';
|
|
2
|
+
import external from '../externalModules';
|
|
3
|
+
function configure(options) {
|
|
4
|
+
if (!options.cornerstone || !options.dicomParser) {
|
|
5
|
+
throw new Error('cornerstoneWADOImageLoader.configure: Options object must contain the keys "cornerstone" and "dicomParser".');
|
|
6
|
+
}
|
|
7
|
+
setOptions(options);
|
|
8
|
+
external.cornerstone = options.cornerstone;
|
|
9
|
+
external.dicomParser = options.dicomParser;
|
|
10
|
+
}
|
|
11
|
+
export default configure;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function convertColorSpace(imageFrame: any, colorBuffer: any, useRGBA: any): void;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { convertRGBColorByPixel, convertRGBColorByPlane, convertYBRFullByPixel, convertYBRFull422ByPixel, convertYBRFullByPlane, convertPALETTECOLOR, } from './colorSpaceConverters/index';
|
|
2
|
+
function convertRGB(imageFrame, colorBuffer, useRGBA) {
|
|
3
|
+
if (imageFrame.planarConfiguration === 0) {
|
|
4
|
+
convertRGBColorByPixel(imageFrame.pixelData, colorBuffer, useRGBA);
|
|
5
|
+
}
|
|
6
|
+
else {
|
|
7
|
+
convertRGBColorByPlane(imageFrame.pixelData, colorBuffer, useRGBA);
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
function convertYBRFull(imageFrame, colorBuffer, useRGBA) {
|
|
11
|
+
if (imageFrame.planarConfiguration === 0) {
|
|
12
|
+
convertYBRFullByPixel(imageFrame.pixelData, colorBuffer, useRGBA);
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
convertYBRFullByPlane(imageFrame.pixelData, colorBuffer, useRGBA);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export default function convertColorSpace(imageFrame, colorBuffer, useRGBA) {
|
|
19
|
+
if (imageFrame.photometricInterpretation === 'RGB') {
|
|
20
|
+
convertRGB(imageFrame, colorBuffer, useRGBA);
|
|
21
|
+
}
|
|
22
|
+
else if (imageFrame.photometricInterpretation === 'YBR_RCT') {
|
|
23
|
+
convertRGB(imageFrame, colorBuffer, useRGBA);
|
|
24
|
+
}
|
|
25
|
+
else if (imageFrame.photometricInterpretation === 'YBR_ICT') {
|
|
26
|
+
convertRGB(imageFrame, colorBuffer, useRGBA);
|
|
27
|
+
}
|
|
28
|
+
else if (imageFrame.photometricInterpretation === 'PALETTE COLOR') {
|
|
29
|
+
convertPALETTECOLOR(imageFrame, colorBuffer, useRGBA);
|
|
30
|
+
}
|
|
31
|
+
else if (imageFrame.photometricInterpretation === 'YBR_FULL_422') {
|
|
32
|
+
convertYBRFull422ByPixel(imageFrame.pixelData, colorBuffer, useRGBA);
|
|
33
|
+
}
|
|
34
|
+
else if (imageFrame.photometricInterpretation === 'YBR_FULL') {
|
|
35
|
+
convertYBRFull(imageFrame, colorBuffer, useRGBA);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
throw new Error(`No color space conversion for photometric interpretation ${imageFrame.photometricInterpretation}`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { ByteArray } from 'dicom-parser';
|
|
2
|
+
import type { DICOMLoaderImageOptions, DICOMLoaderIImage } from '../types';
|
|
3
|
+
import type { Types } from '@cornerstonejs/core/src';
|
|
4
|
+
declare function createImage(imageId: string, pixelData: ByteArray, transferSyntax: string, options?: DICOMLoaderImageOptions): Promise<DICOMLoaderIImage | Types.IImageFrame>;
|
|
5
|
+
export default createImage;
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import external from '../externalModules';
|
|
2
|
+
import getMinMax from '../shared/getMinMax';
|
|
3
|
+
import getPixelDataTypeFromMinMax from '../shared/getPixelDataTypeFromMinMax';
|
|
4
|
+
import convertColorSpace from './convertColorSpace';
|
|
5
|
+
import isColorConversionRequired from './isColorConversionRequired';
|
|
6
|
+
import decodeImageFrame from './decodeImageFrame';
|
|
7
|
+
import getImageFrame from './getImageFrame';
|
|
8
|
+
import getScalingParameters from './getScalingParameters';
|
|
9
|
+
import { getOptions } from './internal/options';
|
|
10
|
+
import isColorImageFn from '../shared/isColorImage';
|
|
11
|
+
let lastImageIdDrawn = '';
|
|
12
|
+
function isModalityLUTForDisplay(sopClassUid) {
|
|
13
|
+
return (sopClassUid !== '1.2.840.10008.5.1.4.1.1.12.1' &&
|
|
14
|
+
sopClassUid !== '1.2.840.10008.5.1.4.1.1.12.2.1');
|
|
15
|
+
}
|
|
16
|
+
function setPixelDataType(imageFrame) {
|
|
17
|
+
const minValue = imageFrame.smallestPixelValue;
|
|
18
|
+
const maxValue = imageFrame.largestPixelValue;
|
|
19
|
+
const TypedArray = getPixelDataTypeFromMinMax(minValue, maxValue);
|
|
20
|
+
if (TypedArray) {
|
|
21
|
+
const typedArray = new TypedArray(imageFrame.pixelData);
|
|
22
|
+
imageFrame.pixelData = typedArray;
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
throw new Error('Could not apply a typed array to the pixel data');
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function removeAFromRGBA(pixelData, targetBuffer) {
|
|
29
|
+
const numPixels = pixelData.length / 4;
|
|
30
|
+
let rgbIndex = 0;
|
|
31
|
+
let bufferIndex = 0;
|
|
32
|
+
for (let i = 0; i < numPixels; i++) {
|
|
33
|
+
targetBuffer[bufferIndex++] = pixelData[rgbIndex++];
|
|
34
|
+
targetBuffer[bufferIndex++] = pixelData[rgbIndex++];
|
|
35
|
+
targetBuffer[bufferIndex++] = pixelData[rgbIndex++];
|
|
36
|
+
rgbIndex++;
|
|
37
|
+
}
|
|
38
|
+
return targetBuffer;
|
|
39
|
+
}
|
|
40
|
+
function createImage(imageId, pixelData, transferSyntax, options = {}) {
|
|
41
|
+
const useRGBA = options.useRGBA;
|
|
42
|
+
options.preScale = {
|
|
43
|
+
enabled: options.preScale && options.preScale.enabled !== undefined
|
|
44
|
+
? options.preScale.enabled
|
|
45
|
+
: true,
|
|
46
|
+
};
|
|
47
|
+
if (!pixelData?.length) {
|
|
48
|
+
return Promise.reject(new Error('The pixel data is missing'));
|
|
49
|
+
}
|
|
50
|
+
const { cornerstone } = external;
|
|
51
|
+
const { MetadataModules } = cornerstone.Enums;
|
|
52
|
+
const canvas = document.createElement('canvas');
|
|
53
|
+
const imageFrame = getImageFrame(imageId);
|
|
54
|
+
imageFrame.decodeLevel = options.decodeLevel;
|
|
55
|
+
options.allowFloatRendering = cornerstone.canRenderFloatTextures();
|
|
56
|
+
if (options.preScale.enabled) {
|
|
57
|
+
const scalingParameters = getScalingParameters(cornerstone.metaData, imageId);
|
|
58
|
+
if (scalingParameters) {
|
|
59
|
+
options.preScale = {
|
|
60
|
+
...options.preScale,
|
|
61
|
+
scalingParameters: scalingParameters,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
const { decodeConfig } = getOptions();
|
|
66
|
+
Object.keys(imageFrame).forEach((key) => {
|
|
67
|
+
if (typeof imageFrame[key] === 'function' ||
|
|
68
|
+
imageFrame[key] instanceof Promise) {
|
|
69
|
+
delete imageFrame[key];
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
const decodePromise = decodeImageFrame(imageFrame, transferSyntax, pixelData, canvas, options, decodeConfig);
|
|
73
|
+
const isColorImage = isColorImageFn(imageFrame.photometricInterpretation);
|
|
74
|
+
return new Promise((resolve, reject) => {
|
|
75
|
+
decodePromise.then(function (imageFrame) {
|
|
76
|
+
let alreadyTyped = false;
|
|
77
|
+
if (options.targetBuffer &&
|
|
78
|
+
options.targetBuffer.type &&
|
|
79
|
+
!isColorImage) {
|
|
80
|
+
const { arrayBuffer, type, offset: rawOffset = 0, length: rawLength, } = options.targetBuffer;
|
|
81
|
+
const imageFrameLength = imageFrame.pixelDataLength;
|
|
82
|
+
const offset = rawOffset;
|
|
83
|
+
const length = rawLength !== null && rawLength !== undefined
|
|
84
|
+
? rawLength
|
|
85
|
+
: imageFrameLength - offset;
|
|
86
|
+
const typedArrayConstructors = {
|
|
87
|
+
Uint8Array,
|
|
88
|
+
Uint16Array,
|
|
89
|
+
Int16Array,
|
|
90
|
+
Float32Array,
|
|
91
|
+
};
|
|
92
|
+
if (length !== imageFrame.pixelDataLength) {
|
|
93
|
+
throw new Error(`target array for image does not have the same length (${length}) as the decoded image length (${imageFrame.pixelDataLength}).`);
|
|
94
|
+
}
|
|
95
|
+
const TypedArrayConstructor = typedArrayConstructors[type];
|
|
96
|
+
const typedArray = arrayBuffer
|
|
97
|
+
? new TypedArrayConstructor(arrayBuffer, offset, length)
|
|
98
|
+
: new TypedArrayConstructor(imageFrame.pixelData);
|
|
99
|
+
if (length !== imageFrame.pixelDataLength) {
|
|
100
|
+
throw new Error('target array for image does not have the same length as the decoded image length.');
|
|
101
|
+
}
|
|
102
|
+
imageFrame.pixelData = typedArray;
|
|
103
|
+
alreadyTyped = true;
|
|
104
|
+
}
|
|
105
|
+
if (!alreadyTyped) {
|
|
106
|
+
setPixelDataType(imageFrame);
|
|
107
|
+
}
|
|
108
|
+
const imagePlaneModule = cornerstone.metaData.get(MetadataModules.IMAGE_PLANE, imageId) || {};
|
|
109
|
+
const voiLutModule = cornerstone.metaData.get(MetadataModules.VOI_LUT, imageId) || {};
|
|
110
|
+
const modalityLutModule = cornerstone.metaData.get(MetadataModules.MODALITY_LUT, imageId) || {};
|
|
111
|
+
const sopCommonModule = cornerstone.metaData.get(MetadataModules.SOP_COMMON, imageId) || {};
|
|
112
|
+
const calibrationModule = cornerstone.metaData.get(MetadataModules.CALIBRATION, imageId) || {};
|
|
113
|
+
const { rows, columns } = imageFrame;
|
|
114
|
+
if (isColorImage) {
|
|
115
|
+
if (isColorConversionRequired(imageFrame)) {
|
|
116
|
+
canvas.height = imageFrame.rows;
|
|
117
|
+
canvas.width = imageFrame.columns;
|
|
118
|
+
const context = canvas.getContext('2d');
|
|
119
|
+
let imageData = context.createImageData(imageFrame.columns, imageFrame.rows);
|
|
120
|
+
if (!useRGBA) {
|
|
121
|
+
imageData = {
|
|
122
|
+
...imageData,
|
|
123
|
+
data: new Uint8ClampedArray(imageFrame.samplesPerPixel *
|
|
124
|
+
imageFrame.columns *
|
|
125
|
+
imageFrame.rows),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
convertColorSpace(imageFrame, imageData.data, useRGBA);
|
|
129
|
+
imageFrame.imageData = imageData;
|
|
130
|
+
imageFrame.pixelData = imageData.data;
|
|
131
|
+
imageFrame.pixelDataLength = imageData.data.length;
|
|
132
|
+
}
|
|
133
|
+
else if (!useRGBA &&
|
|
134
|
+
imageFrame.pixelDataLength === 4 * rows * columns) {
|
|
135
|
+
const colorBuffer = new Uint8Array((imageFrame.pixelData.length / 4) * 3);
|
|
136
|
+
imageFrame.pixelData = removeAFromRGBA(imageFrame.pixelData, colorBuffer);
|
|
137
|
+
imageFrame.pixelDataLength = imageFrame.pixelData.length;
|
|
138
|
+
}
|
|
139
|
+
const minMax = getMinMax(imageFrame.pixelData);
|
|
140
|
+
imageFrame.smallestPixelValue = minMax.min;
|
|
141
|
+
imageFrame.largestPixelValue = minMax.max;
|
|
142
|
+
}
|
|
143
|
+
const image = {
|
|
144
|
+
imageId,
|
|
145
|
+
dataType: imageFrame.pixelData.constructor
|
|
146
|
+
.name,
|
|
147
|
+
color: isColorImage,
|
|
148
|
+
calibration: calibrationModule,
|
|
149
|
+
columnPixelSpacing: imagePlaneModule.columnPixelSpacing,
|
|
150
|
+
columns: imageFrame.columns,
|
|
151
|
+
height: imageFrame.rows,
|
|
152
|
+
preScale: imageFrame.preScale,
|
|
153
|
+
intercept: modalityLutModule.rescaleIntercept
|
|
154
|
+
? modalityLutModule.rescaleIntercept
|
|
155
|
+
: 0,
|
|
156
|
+
slope: modalityLutModule.rescaleSlope
|
|
157
|
+
? modalityLutModule.rescaleSlope
|
|
158
|
+
: 1,
|
|
159
|
+
invert: imageFrame.photometricInterpretation === 'MONOCHROME1',
|
|
160
|
+
minPixelValue: imageFrame.smallestPixelValue,
|
|
161
|
+
maxPixelValue: imageFrame.largestPixelValue,
|
|
162
|
+
rowPixelSpacing: imagePlaneModule.rowPixelSpacing,
|
|
163
|
+
rows: imageFrame.rows,
|
|
164
|
+
sizeInBytes: imageFrame.pixelData.byteLength,
|
|
165
|
+
width: imageFrame.columns,
|
|
166
|
+
windowCenter: voiLutModule.windowCenter
|
|
167
|
+
? voiLutModule.windowCenter[0]
|
|
168
|
+
: undefined,
|
|
169
|
+
windowWidth: voiLutModule.windowWidth
|
|
170
|
+
? voiLutModule.windowWidth[0]
|
|
171
|
+
: undefined,
|
|
172
|
+
voiLUTFunction: voiLutModule.voiLUTFunction
|
|
173
|
+
? voiLutModule.voiLUTFunction
|
|
174
|
+
: undefined,
|
|
175
|
+
decodeTimeInMS: imageFrame.decodeTimeInMS,
|
|
176
|
+
floatPixelData: undefined,
|
|
177
|
+
imageFrame,
|
|
178
|
+
rgba: isColorImage && useRGBA,
|
|
179
|
+
getPixelData: () => imageFrame.pixelData,
|
|
180
|
+
getCanvas: undefined,
|
|
181
|
+
numberOfComponents: imageFrame.samplesPerPixel,
|
|
182
|
+
};
|
|
183
|
+
if (image.color) {
|
|
184
|
+
image.getCanvas = function () {
|
|
185
|
+
if (lastImageIdDrawn === imageId) {
|
|
186
|
+
return canvas;
|
|
187
|
+
}
|
|
188
|
+
const width = image.columns;
|
|
189
|
+
const height = image.rows;
|
|
190
|
+
canvas.height = height;
|
|
191
|
+
canvas.width = width;
|
|
192
|
+
const ctx = canvas.getContext('2d');
|
|
193
|
+
const imageData = ctx.createImageData(width, height);
|
|
194
|
+
const arr = imageFrame.pixelData;
|
|
195
|
+
if (arr.length === width * height * 4) {
|
|
196
|
+
for (let i = 0; i < arr.length; i++) {
|
|
197
|
+
imageData.data[i] = arr[i];
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
else if (arr.length === width * height * 3) {
|
|
201
|
+
let j = 0;
|
|
202
|
+
for (let i = 0; i < arr.length; i += 3) {
|
|
203
|
+
imageData.data[j++] = arr[i];
|
|
204
|
+
imageData.data[j++] = arr[i + 1];
|
|
205
|
+
imageData.data[j++] = arr[i + 2];
|
|
206
|
+
imageData.data[j++] = 255;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
imageFrame.pixelData = imageData.data;
|
|
210
|
+
imageFrame.pixelDataLength = imageData.data.length;
|
|
211
|
+
imageFrame.imageData = imageData;
|
|
212
|
+
ctx.putImageData(imageFrame.imageData, 0, 0);
|
|
213
|
+
lastImageIdDrawn = imageId;
|
|
214
|
+
return canvas;
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
if (modalityLutModule.modalityLUTSequence &&
|
|
218
|
+
modalityLutModule.modalityLUTSequence.length > 0 &&
|
|
219
|
+
isModalityLUTForDisplay(sopCommonModule.sopClassUID)) {
|
|
220
|
+
image.modalityLUT = modalityLutModule.modalityLUTSequence[0];
|
|
221
|
+
}
|
|
222
|
+
if (voiLutModule.voiLUTSequence &&
|
|
223
|
+
voiLutModule.voiLUTSequence.length > 0) {
|
|
224
|
+
image.voiLUT = voiLutModule.voiLUTSequence[0];
|
|
225
|
+
}
|
|
226
|
+
if (image.color) {
|
|
227
|
+
image.windowWidth = 256;
|
|
228
|
+
image.windowCenter = 128;
|
|
229
|
+
}
|
|
230
|
+
if (image.windowCenter === undefined ||
|
|
231
|
+
image.windowWidth === undefined) {
|
|
232
|
+
const minVoi = image.imageFrame.smallestPixelValue;
|
|
233
|
+
const maxVoi = image.imageFrame.largestPixelValue;
|
|
234
|
+
image.windowWidth = maxVoi - minVoi;
|
|
235
|
+
image.windowCenter = (maxVoi + minVoi) / 2;
|
|
236
|
+
}
|
|
237
|
+
resolve(image);
|
|
238
|
+
}, reject);
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
export default createImage;
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import decodeJPEGBaseline8BitColor from './decodeJPEGBaseline8BitColor';
|
|
2
|
+
import external from '../externalModules';
|
|
3
|
+
function processDecodeTask(imageFrame, transferSyntax, pixelData, srcOptions, decodeConfig) {
|
|
4
|
+
const options = { ...srcOptions };
|
|
5
|
+
delete options.loader;
|
|
6
|
+
delete options.streamingData;
|
|
7
|
+
const webWorkerManager = external.cornerstone.getWebWorkerManager();
|
|
8
|
+
const priority = options.priority || undefined;
|
|
9
|
+
const transferList = options.transferPixelData
|
|
10
|
+
? [pixelData.buffer]
|
|
11
|
+
: undefined;
|
|
12
|
+
return webWorkerManager.executeTask('dicomImageLoader', 'decodeTask', {
|
|
13
|
+
imageFrame,
|
|
14
|
+
transferSyntax,
|
|
15
|
+
pixelData,
|
|
16
|
+
options,
|
|
17
|
+
decodeConfig,
|
|
18
|
+
}, {
|
|
19
|
+
priority,
|
|
20
|
+
requestType: options?.requestType,
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
function decodeImageFrame(imageFrame, transferSyntax, pixelData, canvas, options = {}, decodeConfig) {
|
|
24
|
+
switch (transferSyntax) {
|
|
25
|
+
case '1.2.840.10008.1.2':
|
|
26
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
27
|
+
case '1.2.840.10008.1.2.1':
|
|
28
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
29
|
+
case '1.2.840.10008.1.2.2':
|
|
30
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
31
|
+
case '1.2.840.10008.1.2.1.99':
|
|
32
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
33
|
+
case '1.2.840.10008.1.2.5':
|
|
34
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
35
|
+
case '1.2.840.10008.1.2.4.50':
|
|
36
|
+
if (imageFrame.bitsAllocated === 8 &&
|
|
37
|
+
(imageFrame.samplesPerPixel === 3 || imageFrame.samplesPerPixel === 4)) {
|
|
38
|
+
return decodeJPEGBaseline8BitColor(imageFrame, pixelData, canvas);
|
|
39
|
+
}
|
|
40
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
41
|
+
case '1.2.840.10008.1.2.4.51':
|
|
42
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
43
|
+
case '1.2.840.10008.1.2.4.57':
|
|
44
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
45
|
+
case '1.2.840.10008.1.2.4.70':
|
|
46
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
47
|
+
case '1.2.840.10008.1.2.4.80':
|
|
48
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
49
|
+
case '1.2.840.10008.1.2.4.81':
|
|
50
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
51
|
+
case '1.2.840.10008.1.2.4.90':
|
|
52
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
53
|
+
case '1.2.840.10008.1.2.4.91':
|
|
54
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
55
|
+
case '3.2.840.10008.1.2.4.96':
|
|
56
|
+
case '1.2.840.10008.1.2.4.201':
|
|
57
|
+
case '1.2.840.10008.1.2.4.202':
|
|
58
|
+
case '1.2.840.10008.1.2.4.203':
|
|
59
|
+
return processDecodeTask(imageFrame, transferSyntax, pixelData, options, decodeConfig);
|
|
60
|
+
}
|
|
61
|
+
return Promise.reject(new Error(`No decoder for transfer syntax ${transferSyntax}`));
|
|
62
|
+
}
|
|
63
|
+
export default decodeImageFrame;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ByteArray } from 'dicom-parser';
|
|
2
|
+
import type { Types } from '@cornerstonejs/core';
|
|
3
|
+
declare function decodeJPEGBaseline8BitColor(imageFrame: Types.IImageFrame, pixelData: ByteArray, canvas: HTMLCanvasElement): Promise<Types.IImageFrame>;
|
|
4
|
+
export default decodeJPEGBaseline8BitColor;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import getMinMax from '../shared/getMinMax';
|
|
2
|
+
function arrayBufferToString(buffer) {
|
|
3
|
+
return binaryToString(String.fromCharCode.apply(null, Array.prototype.slice.apply(new Uint8Array(buffer))));
|
|
4
|
+
}
|
|
5
|
+
function binaryToString(binary) {
|
|
6
|
+
let error;
|
|
7
|
+
try {
|
|
8
|
+
return decodeURIComponent(escape(binary));
|
|
9
|
+
}
|
|
10
|
+
catch (_error) {
|
|
11
|
+
error = _error;
|
|
12
|
+
if (error instanceof URIError) {
|
|
13
|
+
return binary;
|
|
14
|
+
}
|
|
15
|
+
throw error;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function decodeJPEGBaseline8BitColor(imageFrame, pixelData, canvas) {
|
|
19
|
+
const start = new Date().getTime();
|
|
20
|
+
const imgBlob = new Blob([pixelData], { type: 'image/jpeg' });
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
const fileReader = new FileReader();
|
|
23
|
+
if (fileReader.readAsBinaryString === undefined) {
|
|
24
|
+
fileReader.readAsArrayBuffer(imgBlob);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
fileReader.readAsBinaryString(imgBlob);
|
|
28
|
+
}
|
|
29
|
+
fileReader.onload = function () {
|
|
30
|
+
const img = new Image();
|
|
31
|
+
img.onload = function () {
|
|
32
|
+
canvas.height = img.height;
|
|
33
|
+
canvas.width = img.width;
|
|
34
|
+
imageFrame.rows = img.height;
|
|
35
|
+
imageFrame.columns = img.width;
|
|
36
|
+
const context = canvas.getContext('2d');
|
|
37
|
+
context.drawImage(this, 0, 0);
|
|
38
|
+
const imageData = context.getImageData(0, 0, img.width, img.height);
|
|
39
|
+
const end = new Date().getTime();
|
|
40
|
+
imageFrame.pixelData = new Uint8Array(imageData.data.buffer);
|
|
41
|
+
imageFrame.imageData = imageData;
|
|
42
|
+
imageFrame.decodeTimeInMS = end - start;
|
|
43
|
+
const minMax = getMinMax(imageFrame.pixelData);
|
|
44
|
+
imageFrame.smallestPixelValue = minMax.min;
|
|
45
|
+
imageFrame.largestPixelValue = minMax.max;
|
|
46
|
+
imageFrame.pixelDataLength = imageFrame.pixelData.length;
|
|
47
|
+
resolve(imageFrame);
|
|
48
|
+
};
|
|
49
|
+
img.onerror = function (error) {
|
|
50
|
+
reject(error);
|
|
51
|
+
};
|
|
52
|
+
if (fileReader.readAsBinaryString === undefined) {
|
|
53
|
+
img.src = `data:image/jpeg;base64,${window.btoa(arrayBufferToString(fileReader.result))}`;
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
img.src = `data:image/jpeg;base64,${window.btoa(fileReader.result)}`;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
fileReader.onerror = (e) => {
|
|
60
|
+
reject(e);
|
|
61
|
+
};
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export default decodeJPEGBaseline8BitColor;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import external from '../externalModules';
|
|
2
|
+
function getImageFrame(imageId) {
|
|
3
|
+
const { cornerstone } = external;
|
|
4
|
+
const imagePixelModule = cornerstone.metaData.get('imagePixelModule', imageId);
|
|
5
|
+
return {
|
|
6
|
+
samplesPerPixel: imagePixelModule.samplesPerPixel,
|
|
7
|
+
photometricInterpretation: imagePixelModule.photometricInterpretation,
|
|
8
|
+
planarConfiguration: imagePixelModule.planarConfiguration,
|
|
9
|
+
rows: imagePixelModule.rows,
|
|
10
|
+
columns: imagePixelModule.columns,
|
|
11
|
+
bitsAllocated: imagePixelModule.bitsAllocated,
|
|
12
|
+
bitsStored: imagePixelModule.bitsStored,
|
|
13
|
+
pixelRepresentation: imagePixelModule.pixelRepresentation,
|
|
14
|
+
smallestPixelValue: imagePixelModule.smallestPixelValue,
|
|
15
|
+
largestPixelValue: imagePixelModule.largestPixelValue,
|
|
16
|
+
redPaletteColorLookupTableDescriptor: imagePixelModule.redPaletteColorLookupTableDescriptor,
|
|
17
|
+
greenPaletteColorLookupTableDescriptor: imagePixelModule.greenPaletteColorLookupTableDescriptor,
|
|
18
|
+
bluePaletteColorLookupTableDescriptor: imagePixelModule.bluePaletteColorLookupTableDescriptor,
|
|
19
|
+
redPaletteColorLookupTableData: imagePixelModule.redPaletteColorLookupTableData,
|
|
20
|
+
greenPaletteColorLookupTableData: imagePixelModule.greenPaletteColorLookupTableData,
|
|
21
|
+
bluePaletteColorLookupTableData: imagePixelModule.bluePaletteColorLookupTableData,
|
|
22
|
+
pixelData: undefined,
|
|
23
|
+
imageId,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
export default getImageFrame;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
function getInstanceModule(imageId, metaDataProvider, types) {
|
|
2
|
+
const result = {};
|
|
3
|
+
for (const t of types) {
|
|
4
|
+
try {
|
|
5
|
+
const data = metaDataProvider(t, imageId);
|
|
6
|
+
if (data) {
|
|
7
|
+
const capitalizedData = {};
|
|
8
|
+
for (const key in data) {
|
|
9
|
+
if (key in data) {
|
|
10
|
+
const capitalizedKey = capitalizeTag(key);
|
|
11
|
+
capitalizedData[capitalizedKey] = data[key];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
Object.assign(result, capitalizedData);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch (error) {
|
|
18
|
+
console.error(`Error retrieving ${t} data:`, error);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
}
|
|
23
|
+
const capitalizeTag = (tag) => tag.charAt(0).toUpperCase() + tag.slice(1);
|
|
24
|
+
const instanceModuleNames = [
|
|
25
|
+
'multiframeModule',
|
|
26
|
+
'generalSeriesModule',
|
|
27
|
+
'patientStudyModule',
|
|
28
|
+
'imagePlaneModule',
|
|
29
|
+
'nmMultiframeGeometryModule',
|
|
30
|
+
'imagePixelModule',
|
|
31
|
+
'modalityLutModule',
|
|
32
|
+
'voiLutModule',
|
|
33
|
+
'sopCommonModule',
|
|
34
|
+
'petIsotopeModule',
|
|
35
|
+
'overlayPlaneModule',
|
|
36
|
+
'transferSyntax',
|
|
37
|
+
'petSeriesModule',
|
|
38
|
+
'petImageModule',
|
|
39
|
+
];
|
|
40
|
+
export { getInstanceModule, instanceModuleNames };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export default function getMinMax(storedPixelData) {
|
|
2
|
+
let min = storedPixelData[0];
|
|
3
|
+
let max = storedPixelData[0];
|
|
4
|
+
let storedPixel;
|
|
5
|
+
const numPixels = storedPixelData.length;
|
|
6
|
+
for (let index = 0; index < numPixels; index++) {
|
|
7
|
+
storedPixel = storedPixelData[index];
|
|
8
|
+
min = Math.min(min, storedPixel);
|
|
9
|
+
max = Math.max(max, storedPixel);
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
min,
|
|
13
|
+
max,
|
|
14
|
+
};
|
|
15
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export default function getScalingParameters(metaData, imageId) {
|
|
2
|
+
const modalityLutModule = metaData.get('modalityLutModule', imageId) || {};
|
|
3
|
+
const generalSeriesModule = (metaData.get('generalSeriesModule', imageId) ||
|
|
4
|
+
{});
|
|
5
|
+
const { modality } = generalSeriesModule;
|
|
6
|
+
const scalingParameters = {
|
|
7
|
+
rescaleSlope: modalityLutModule.rescaleSlope,
|
|
8
|
+
rescaleIntercept: modalityLutModule.rescaleIntercept,
|
|
9
|
+
modality,
|
|
10
|
+
};
|
|
11
|
+
const suvFactor = metaData.get('scalingModule', imageId) || {};
|
|
12
|
+
return {
|
|
13
|
+
...scalingParameters,
|
|
14
|
+
...(modality === 'PT' && { suvbw: suvFactor.suvbw }),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function imageIdToURI(imageId: string): string;
|