diff --git a/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js b/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js index 99e289f20..3738560bc 100644 --- a/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js +++ b/Packages/ohif-study-list/server/services/wado/retrieveMetadata.js @@ -97,6 +97,22 @@ function getSourceImageInstanceUid(instance) { } } +function getPaletteColor(server, instance, tag, lutDescriptor) { + const lut = []; + const numLutEntries = lutDescriptor[0]; + const bits = lutDescriptor[2]; + const data = DICOMWeb.getBulkData(instance[tag].BulkDataURI, server.requestOptions); + + for (var i = 0; i < numLutEntries; i++) { + if(bits === 16) { + lut[i] = data.readUInt16LE(i*2); + } else { + lut[i] = data.readUInt8(i); + } + } + + return lut; +} /** * Fetch palette colors for instances with "PALETTE COLOR" photometricInterpretation. @@ -105,7 +121,7 @@ function getSourceImageInstanceUid(instance) { * @param instance {Object} The retrieved instance metadata; * @returns {String} The ReferenceSOPInstanceUID */ -function getPaletteColors(server, instance) { +function getPaletteColors(server, instance, lutDescriptor) { let entry = null, paletteUID = DICOMWeb.getString(instance['00281199']); @@ -120,9 +136,10 @@ function getPaletteColors(server, instance) { // no entry on cache... Fetch remote data. try { let r, g, b; - r = DICOMWeb.getBulkData(instance['00281201'].BulkDataURI, server.requestOptions); - g = DICOMWeb.getBulkData(instance['00281202'].BulkDataURI, server.requestOptions); - b = DICOMWeb.getBulkData(instance['00281203'].BulkDataURI, server.requestOptions); + r = getPaletteColor(server, instance, '00281201', lutDescriptor); + g = getPaletteColor(server, instance, '00281202', lutDescriptor);; + b = getPaletteColor(server, instance, '00281203', lutDescriptor);; + entry = { red: r, green: g, blue: b }; if (paletteUID !== null) { // when paletteUID is present, the entry can be cached... @@ -261,17 +278,21 @@ function resultDataToStudyMetadata(server, studyInstanceUid, resultData) { // Get additional information if the instance uses "PALETTE COLOR" photometric interpretation if (instanceSummary.photometricInterpretation === 'PALETTE COLOR') { - let palettes = getPaletteColors(server, instance); + const redPaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281101'])); + const greenPaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281102'])); + const bluePaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281103'])); + const palettes = getPaletteColors(server, instance, redPaletteColorLookupTableDescriptor); + if (palettes) { if (palettes.uid) { instanceSummary.paletteColorLookupTableUID = palettes.uid; } - instanceSummary.redPaletteColorLookupTable = palettes.red; - instanceSummary.greenPaletteColorLookupTable = palettes.green; - instanceSummary.bluePaletteColorLookupTable = palettes.blue; - instanceSummary.redPaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281101'])); - instanceSummary.greenPaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281102'])); - instanceSummary.bluePaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281103'])); + instanceSummary.redPaletteColorLookupTableData = palettes.red; + instanceSummary.greenPaletteColorLookupTableData = palettes.green; + instanceSummary.bluePaletteColorLookupTableData = palettes.blue; + instanceSummary.redPaletteColorLookupTableDescriptor = redPaletteColorLookupTableDescriptor; + instanceSummary.greenPaletteColorLookupTableDescriptor = greenPaletteColorLookupTableDescriptor; + instanceSummary.bluePaletteColorLookupTableDescriptor = bluePaletteColorLookupTableDescriptor; } } diff --git a/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js b/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js index 2488954ed..37702ae42 100644 --- a/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js +++ b/Packages/ohif-viewerbase/client/lib/getWADORSImageId.js @@ -27,12 +27,20 @@ class ImageMetadataBuilder { const tag = this.tags[key]; const multi = !!tag.multi; - const value = tag.value && multi ? tag.value.split('\\') : [tag.value]; + let value = tag.value; - if((value.length === 1) && (value[0] == null)) { + if((value == null) || ((value.length === 1) && (value[0] == null))) { return; } + if((typeof value === 'string') && multi) { + value = value.split('\\'); + } + + if(!_.isArray(value)) { + value = [value]; + } + json[key] = { Value: value }; @@ -42,7 +50,7 @@ class ImageMetadataBuilder { } } -formatWADORSImageUrl = function(wadorsuri, frame) { +function formatWADORSImageUrl(wadorsuri, frame) { // We need to sum 1 because WADO-RS frame number is 1-based frame = (frame || 0) + 1; @@ -91,11 +99,16 @@ export function getWADORSImageId(instance, frame) { .addTag('00281052', instance.rescaleIntercept) .addTag('00281053', instance.rescaleSlope) .addTag('00281054', instance.rescaleType) + .addTag('00281101', instance.redPaletteColorLookupTableDescriptor) + .addTag('00281102', instance.greenPaletteColorLookupTableDescriptor) + .addTag('00281103', instance.bluePaletteColorLookupTableDescriptor) + .addTag('00281201', instance.redPaletteColorLookupTableData) + .addTag('00281202', instance.greenPaletteColorLookupTableData) + .addTag('00281203', instance.bluePaletteColorLookupTableData) .toJSON(); _.extend(imageMetadata, { uri: uri, - sizeInBytes: instance.rows * instance.columns * (instance.bitsAllocated / 8), instance: instance });