wadors :: retrieveMetadata :: palette colors

This commit is contained in:
Leonardo Campos 2017-02-21 11:50:22 -03:00
parent cb72bd17fc
commit 74b99cb28d
2 changed files with 49 additions and 15 deletions

View File

@ -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. * Fetch palette colors for instances with "PALETTE COLOR" photometricInterpretation.
@ -105,7 +121,7 @@ function getSourceImageInstanceUid(instance) {
* @param instance {Object} The retrieved instance metadata; * @param instance {Object} The retrieved instance metadata;
* @returns {String} The ReferenceSOPInstanceUID * @returns {String} The ReferenceSOPInstanceUID
*/ */
function getPaletteColors(server, instance) { function getPaletteColors(server, instance, lutDescriptor) {
let entry = null, let entry = null,
paletteUID = DICOMWeb.getString(instance['00281199']); paletteUID = DICOMWeb.getString(instance['00281199']);
@ -120,9 +136,10 @@ function getPaletteColors(server, instance) {
// no entry on cache... Fetch remote data. // no entry on cache... Fetch remote data.
try { try {
let r, g, b; let r, g, b;
r = DICOMWeb.getBulkData(instance['00281201'].BulkDataURI, server.requestOptions); r = getPaletteColor(server, instance, '00281201', lutDescriptor);
g = DICOMWeb.getBulkData(instance['00281202'].BulkDataURI, server.requestOptions); g = getPaletteColor(server, instance, '00281202', lutDescriptor);;
b = DICOMWeb.getBulkData(instance['00281203'].BulkDataURI, server.requestOptions); b = getPaletteColor(server, instance, '00281203', lutDescriptor);;
entry = { red: r, green: g, blue: b }; entry = { red: r, green: g, blue: b };
if (paletteUID !== null) { if (paletteUID !== null) {
// when paletteUID is present, the entry can be cached... // 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 // Get additional information if the instance uses "PALETTE COLOR" photometric interpretation
if (instanceSummary.photometricInterpretation === 'PALETTE COLOR') { 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) {
if (palettes.uid) { if (palettes.uid) {
instanceSummary.paletteColorLookupTableUID = palettes.uid; instanceSummary.paletteColorLookupTableUID = palettes.uid;
} }
instanceSummary.redPaletteColorLookupTable = palettes.red; instanceSummary.redPaletteColorLookupTableData = palettes.red;
instanceSummary.greenPaletteColorLookupTable = palettes.green; instanceSummary.greenPaletteColorLookupTableData = palettes.green;
instanceSummary.bluePaletteColorLookupTable = palettes.blue; instanceSummary.bluePaletteColorLookupTableData = palettes.blue;
instanceSummary.redPaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281101'])); instanceSummary.redPaletteColorLookupTableDescriptor = redPaletteColorLookupTableDescriptor;
instanceSummary.greenPaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281102'])); instanceSummary.greenPaletteColorLookupTableDescriptor = greenPaletteColorLookupTableDescriptor;
instanceSummary.bluePaletteColorLookupTableDescriptor = parseFloatArray(DICOMWeb.getString(instance['00281103'])); instanceSummary.bluePaletteColorLookupTableDescriptor = bluePaletteColorLookupTableDescriptor;
} }
} }

View File

@ -27,12 +27,20 @@ class ImageMetadataBuilder {
const tag = this.tags[key]; const tag = this.tags[key];
const multi = !!tag.multi; 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; return;
} }
if((typeof value === 'string') && multi) {
value = value.split('\\');
}
if(!_.isArray(value)) {
value = [value];
}
json[key] = { json[key] = {
Value: value 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 // We need to sum 1 because WADO-RS frame number is 1-based
frame = (frame || 0) + 1; frame = (frame || 0) + 1;
@ -91,11 +99,16 @@ export function getWADORSImageId(instance, frame) {
.addTag('00281052', instance.rescaleIntercept) .addTag('00281052', instance.rescaleIntercept)
.addTag('00281053', instance.rescaleSlope) .addTag('00281053', instance.rescaleSlope)
.addTag('00281054', instance.rescaleType) .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(); .toJSON();
_.extend(imageMetadata, { _.extend(imageMetadata, {
uri: uri, uri: uri,
sizeInBytes: instance.rows * instance.columns * (instance.bitsAllocated / 8),
instance: instance instance: instance
}); });