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:
Erik Ziegler 2020-03-24 16:18:13 +01:00 committed by GitHub
parent d9a50b6b08
commit 404d52fe5c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 51 additions and 41 deletions

View File

@ -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:

View File

@ -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;
}

View File

@ -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;
} }

View 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;
}

View 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;
}