fix: OverlayPlane module usage for ArrayBuffer, BulkDataURI, and InlineBinary cases, as well as PaletteColor LUTs for ArrayBuffer (i.e. local drag/drop) case (#1546)
This commit is contained in:
parent
d9a50b6b08
commit
404d52fe5c
@ -58,9 +58,7 @@ class MetadataProvider {
|
|||||||
|
|
||||||
Object.assign(instance, naturalizedDataset);
|
Object.assign(instance, naturalizedDataset);
|
||||||
|
|
||||||
if (options.server) {
|
await this._checkBulkDataAndInlineBinaries(instance, options.server);
|
||||||
await this._checkBulkDataAndInlineBinaries(instance, options.server);
|
|
||||||
}
|
|
||||||
|
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
@ -344,7 +342,7 @@ class MetadataProvider {
|
|||||||
|
|
||||||
break;
|
break;
|
||||||
case WADO_IMAGE_LOADER_TAGS.OVERLAY_PLANE_MODULE:
|
case WADO_IMAGE_LOADER_TAGS.OVERLAY_PLANE_MODULE:
|
||||||
metadata = [];
|
const overlays = [];
|
||||||
|
|
||||||
for (
|
for (
|
||||||
let overlayGroup = 0x00;
|
let overlayGroup = 0x00;
|
||||||
@ -389,9 +387,13 @@ class MetadataProvider {
|
|||||||
roiStandardDeviation: instance[ROIStandardDeviationTag],
|
roiStandardDeviation: instance[ROIStandardDeviationTag],
|
||||||
};
|
};
|
||||||
|
|
||||||
metadata.push(overlay);
|
overlays.push(overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
metadata = {
|
||||||
|
overlays
|
||||||
|
};
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case WADO_IMAGE_LOADER_TAGS.PATIENT_MODULE:
|
case WADO_IMAGE_LOADER_TAGS.PATIENT_MODULE:
|
||||||
|
|||||||
@ -1,5 +1,7 @@
|
|||||||
import { api } from 'dicomweb-client';
|
import { api } from 'dicomweb-client';
|
||||||
import DICOMWeb from '../../DICOMWeb';
|
import DICOMWeb from '../../DICOMWeb';
|
||||||
|
import str2ab from '../str2ab';
|
||||||
|
import unpackOverlay from './unpackOverlay';
|
||||||
|
|
||||||
export default async function fetchOverlayData(instance, server) {
|
export default async function fetchOverlayData(instance, server) {
|
||||||
const OverlayDataPromises = [];
|
const OverlayDataPromises = [];
|
||||||
@ -15,11 +17,18 @@ export default async function fetchOverlayData(instance, server) {
|
|||||||
|
|
||||||
const OverlayDataTag = `${groupStr}3000`;
|
const OverlayDataTag = `${groupStr}3000`;
|
||||||
|
|
||||||
if (instance[OverlayDataTag] && instance[OverlayDataTag].BulkDataURI) {
|
if (instance[OverlayDataTag] && instance[OverlayDataTag].InlineBinary) {
|
||||||
|
const inlineBinaryData = atob(instance[OverlayDataTag].InlineBinary);
|
||||||
|
const arraybuffer = str2ab(inlineBinaryData);
|
||||||
|
|
||||||
|
instance[OverlayDataTag] = unpackOverlay(arraybuffer)
|
||||||
|
} else if (instance[OverlayDataTag] && instance[OverlayDataTag].BulkDataURI) {
|
||||||
OverlayDataPromises.push(
|
OverlayDataPromises.push(
|
||||||
_getOverlayData(instance[OverlayDataTag], server)
|
_getOverlayData(instance[OverlayDataTag], server)
|
||||||
);
|
);
|
||||||
OverlayDataTags.push(OverlayDataTag);
|
OverlayDataTags.push(OverlayDataTag);
|
||||||
|
} else if (instance[OverlayDataTag] && instance[OverlayDataTag] instanceof ArrayBuffer) {
|
||||||
|
instance[OverlayDataTag] = unpackOverlay(instance[OverlayDataTag])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,19 +69,7 @@ async function _getOverlayData(tag, server) {
|
|||||||
return dicomWeb
|
return dicomWeb
|
||||||
.retrieveBulkData(options)
|
.retrieveBulkData(options)
|
||||||
.then(result => result[0])
|
.then(result => result[0])
|
||||||
.then(_unpackOverlay);
|
.then(unpackOverlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
function _unpackOverlay(arrayBuffer) {
|
|
||||||
const bitArray = new Uint8Array(arrayBuffer);
|
|
||||||
const byteArray = new Uint8Array(8 * bitArray.length);
|
|
||||||
|
|
||||||
for (let byteIndex = 0; byteIndex < byteArray.length; byteIndex++) {
|
|
||||||
const bitIndex = byteIndex % 8;
|
|
||||||
const bitByteIndex = Math.floor(byteIndex / 8);
|
|
||||||
byteArray[byteIndex] =
|
|
||||||
1 * ((bitArray[bitByteIndex] & (1 << bitIndex)) >> bitIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
return byteArray;
|
|
||||||
}
|
|
||||||
|
|||||||
@ -1,5 +1,6 @@
|
|||||||
import { api } from 'dicomweb-client';
|
import { api } from 'dicomweb-client';
|
||||||
import DICOMWeb from '../../DICOMWeb';
|
import DICOMWeb from '../../DICOMWeb';
|
||||||
|
import str2ab from '../str2ab';
|
||||||
|
|
||||||
export default async function fetchPaletteColorLookupTableData(
|
export default async function fetchPaletteColorLookupTableData(
|
||||||
instance,
|
instance,
|
||||||
@ -157,31 +158,12 @@ function _getPaletteColor(server, paletteColorLookupTableData, lutDescriptor) {
|
|||||||
.then(arrayBufferToPaletteColorLUT);
|
.then(arrayBufferToPaletteColorLUT);
|
||||||
} else if (paletteColorLookupTableData.InlineBinary) {
|
} else if (paletteColorLookupTableData.InlineBinary) {
|
||||||
const inlineBinaryData = atob(paletteColorLookupTableData.InlineBinary);
|
const inlineBinaryData = atob(paletteColorLookupTableData.InlineBinary);
|
||||||
const arraybuffer = _str2ab(inlineBinaryData);
|
const arraybuffer = str2ab(inlineBinaryData);
|
||||||
|
|
||||||
return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
resolve(arrayBufferToPaletteColorLUT(arraybuffer));
|
resolve(arrayBufferToPaletteColorLUT(arraybuffer));
|
||||||
});
|
});
|
||||||
|
} else {
|
||||||
|
return Promise.resolve(arrayBufferToPaletteColorLUT(paletteColorLookupTableData));
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(
|
|
||||||
'Palette Color LUT was not provided as InlineBinary or BulkDataURI'
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert String to ArrayBuffer
|
|
||||||
*
|
|
||||||
* @param {String} str Input String
|
|
||||||
* @return {ArrayBuffer} Output converted ArrayBuffer
|
|
||||||
*/
|
|
||||||
function _str2ab(str) {
|
|
||||||
const strLen = str.length;
|
|
||||||
const bytes = new Uint8Array(strLen);
|
|
||||||
|
|
||||||
for (let i = 0; i < strLen; i++) {
|
|
||||||
bytes[i] = str.charCodeAt(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
return bytes.buffer;
|
|
||||||
}
|
}
|
||||||
|
|||||||
13
platform/core/src/utils/metadataProvider/unpackOverlay.js
Normal file
13
platform/core/src/utils/metadataProvider/unpackOverlay.js
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
export default function unpackOverlay(arrayBuffer) {
|
||||||
|
const bitArray = new Uint8Array(arrayBuffer);
|
||||||
|
const byteArray = new Uint8Array(8 * bitArray.length);
|
||||||
|
|
||||||
|
for (let byteIndex = 0; byteIndex < byteArray.length; byteIndex++) {
|
||||||
|
const bitIndex = byteIndex % 8;
|
||||||
|
const bitByteIndex = Math.floor(byteIndex / 8);
|
||||||
|
byteArray[byteIndex] =
|
||||||
|
1 * ((bitArray[bitByteIndex] & (1 << bitIndex)) >> bitIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return byteArray;
|
||||||
|
}
|
||||||
16
platform/core/src/utils/str2ab.js
Normal file
16
platform/core/src/utils/str2ab.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
/**
|
||||||
|
* Convert String to ArrayBuffer
|
||||||
|
*
|
||||||
|
* @param {String} str Input String
|
||||||
|
* @return {ArrayBuffer} Output converted ArrayBuffer
|
||||||
|
*/
|
||||||
|
export default function str2ab(str) {
|
||||||
|
const strLen = str.length;
|
||||||
|
const bytes = new Uint8Array(strLen);
|
||||||
|
|
||||||
|
for (let i = 0; i < strLen; i++) {
|
||||||
|
bytes[i] = str.charCodeAt(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bytes.buffer;
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user